diff --git a/qtfs/qtfs_common/user_engine.c b/qtfs/qtfs_common/user_engine.c index 8ecbdcb41951c8bc5705fb8a26425190c7f8ac50..5a619fb7cd0ae0fb19e7cef7da4276b124fb556c 100644 --- a/qtfs/qtfs_common/user_engine.c +++ b/qtfs/qtfs_common/user_engine.c @@ -85,6 +85,8 @@ struct engine_arg { #define ENGINE_LOCK_ADDR "/var/run/qtfs/engine.lock" #define ENGINE_LOCK_FILE_DIR "/var/run/qtfs/" +static volatile sig_atomic_t sig_int_flag = 0; + static int engine_env_prepare() { DIR *dir; @@ -173,6 +175,18 @@ static void *qtfs_engine_kthread(void *arg) engine_out("qtfs server thread:%d exit.", parg->thread_idx); break; } + if (sig_int_flag == 1) { + engine_out("qtfs engine recv SIGINT."); + + if (qtfs_fd < 0) { + engine_err("qtfs engine signal int file:%s open failed, fd:%d.", QTFS_SERVER_FILE, qtfs_fd); + continue; + } + ret = ioctl(qtfs_fd, QTFS_IOCTL_EXIT, 0); + engine_out("qtfs engine send QTFS_IOCTL_EXIT to kernel, get return value:%d.", ret); + engine_run = 0; + break; + } if (ret != QTOK) { usleep(1000); } @@ -185,16 +199,7 @@ end: static void qtfs_signal_int(int signum) { - engine_out("qtfs engine recv signal number:%d.", signum); - - if (qtfs_fd < 0) { - engine_err("qtfs engine signal int file:%s open failed, fd:%d.", QTFS_SERVER_FILE, qtfs_fd); - return; - } - long ret = ioctl(qtfs_fd, QTFS_IOCTL_EXIT, 0); - engine_out("qtfs engine send QTFS_IOCTL_EXIT to kernel, get return value:%d.", ret); - engine_run = 0; - + sig_int_flag = 1; return; } diff --git a/qtfs/rexec/rexec_server.c b/qtfs/rexec/rexec_server.c index 0c4b3c193398136716c37e1b11a9e1371a6e6501..bd104143b24e3d6e60fad369c831c5f8ffb8b6d5 100644 --- a/qtfs/rexec/rexec_server.c +++ b/qtfs/rexec/rexec_server.c @@ -42,6 +42,7 @@ static int main_epoll_fd = -1; FILE *rexec_logfile = NULL; static GHashTable *child_hash = NULL; +static volatile sig_atomic_t sig_chld_flag = 0; #define REXEC_WHITELIST_MAX_ITEMS 256 struct rexec_white_list_str { @@ -251,7 +252,7 @@ static int rexec_whitelist_check(char *binary) } #define IS_VALID_FD(fd) (fd > STDERR_FILENO) -static void rexec_server_sig_chld(int num) +static void handle_sig_chld(void) { int status; pid_t pid; @@ -276,6 +277,12 @@ static void rexec_server_sig_chld(int num) return; } +static void rexec_server_sig_chld(int num) +{ + sig_chld_flag = 1; + return; +} + static void rexec_server_sig_pipe(int signum) { return; @@ -493,6 +500,10 @@ static void rexec_server_mainloop() goto end; } while (1) { + if (sig_chld_flag == 1) { + handle_sig_chld(); + sig_chld_flag = 0; + } int n = epoll_wait(main_epoll_fd, evts, REXEC_MAX_EVENTS, 1000); if (n == 0) continue;