diff options
-rw-r--r-- | os-posix.c | 27 | ||||
-rw-r--r-- | qemu-os-posix.h | 2 | ||||
-rw-r--r-- | qemu-os-win32.h | 3 | ||||
-rw-r--r-- | vl.c | 33 |
4 files changed, 33 insertions, 32 deletions
diff --git a/os-posix.c b/os-posix.c index 948f662e91..01dbec2e36 100644 --- a/os-posix.c +++ b/os-posix.c @@ -26,6 +26,8 @@ #include <unistd.h> #include <fcntl.h> #include <signal.h> +#include <sys/types.h> +#include <sys/wait.h> /* Needed early for CONFIG_BSD etc. */ #include "config-host.h" @@ -39,3 +41,28 @@ void os_setup_early_signal_handling(void) act.sa_handler = SIG_IGN; sigaction(SIGPIPE, &act, NULL); } + +static void termsig_handler(int signal) +{ + qemu_system_shutdown_request(); +} + +static void sigchld_handler(int signal) +{ + waitpid(-1, NULL, WNOHANG); +} + +void os_setup_signal_handling(void) +{ + struct sigaction act; + + memset(&act, 0, sizeof(act)); + act.sa_handler = termsig_handler; + sigaction(SIGINT, &act, NULL); + sigaction(SIGHUP, &act, NULL); + sigaction(SIGTERM, &act, NULL); + + act.sa_handler = sigchld_handler; + act.sa_flags = SA_NOCLDSTOP; + sigaction(SIGCHLD, &act, NULL); +} diff --git a/qemu-os-posix.h b/qemu-os-posix.h index 96d1036b47..ff5adb1b2b 100644 --- a/qemu-os-posix.h +++ b/qemu-os-posix.h @@ -30,4 +30,6 @@ static inline void os_host_main_loop_wait(int *timeout) { } +void os_setup_signal_handling(void); + #endif diff --git a/qemu-os-win32.h b/qemu-os-win32.h index 4d1cac852b..e7e2ee3abf 100644 --- a/qemu-os-win32.h +++ b/qemu-os-win32.h @@ -41,4 +41,7 @@ int qemu_add_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); void qemu_del_wait_object(HANDLE handle, WaitObjectFunc *func, void *opaque); void os_host_main_loop_wait(int *timeout); + +static inline void os_setup_signal_handling(void) {} + #endif @@ -1986,35 +1986,6 @@ static int balloon_parse(const char *arg) return -1; } -#ifndef _WIN32 - -static void termsig_handler(int signal) -{ - qemu_system_shutdown_request(); -} - -static void sigchld_handler(int signal) -{ - waitpid(-1, NULL, WNOHANG); -} - -static void sighandler_setup(void) -{ - struct sigaction act; - - memset(&act, 0, sizeof(act)); - act.sa_handler = termsig_handler; - sigaction(SIGINT, &act, NULL); - sigaction(SIGHUP, &act, NULL); - sigaction(SIGTERM, &act, NULL); - - act.sa_handler = sigchld_handler; - act.sa_flags = SA_NOCLDSTOP; - sigaction(SIGCHLD, &act, NULL); -} - -#endif - #ifdef _WIN32 /* Look for support files in the same directory as the executable. */ static char *find_datadir(const char *argv0) @@ -3556,10 +3527,8 @@ int main(int argc, char **argv, char **envp) cpu_synchronize_all_post_init(); -#ifndef _WIN32 /* must be after terminal init, SDL library changes signal handlers */ - sighandler_setup(); -#endif + os_setup_signal_handling(); set_numa_modes(); |