mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
slirp: Avoid zombie processes after fork_exec
Slirp uses fork_exec for spawning service processes, and QEMU uses this for running smbd. As SIGCHLD is not handled, these processes become zombies on termination. Fix this by installing a proper signal handler, but also make sure we disable the signal while waiting on forked network setup/shutdown scripts. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Mark McLoughlin <markmc@redhat.com>
This commit is contained in:
parent
c27ff60871
commit
7c3370d4fe
2 changed files with 44 additions and 27 deletions
13
vl.c
13
vl.c
|
@ -4783,7 +4783,12 @@ static void termsig_handler(int signal)
|
|||
qemu_system_shutdown_request();
|
||||
}
|
||||
|
||||
static void termsig_setup(void)
|
||||
static void sigchld_handler(int signal)
|
||||
{
|
||||
waitpid(-1, NULL, WNOHANG);
|
||||
}
|
||||
|
||||
static void sighandler_setup(void)
|
||||
{
|
||||
struct sigaction act;
|
||||
|
||||
|
@ -4792,6 +4797,10 @@ static void termsig_setup(void)
|
|||
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
|
||||
|
@ -5918,7 +5927,7 @@ int main(int argc, char **argv, char **envp)
|
|||
|
||||
#ifndef _WIN32
|
||||
/* must be after terminal init, SDL library changes signal handlers */
|
||||
termsig_setup();
|
||||
sighandler_setup();
|
||||
#endif
|
||||
|
||||
/* Maintain compatibility with multiple stdio monitors */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue