diff --git a/base-linux/src/base/thread/thread_linux.cc b/base-linux/src/base/thread/thread_linux.cc index 7a7e64329..e02f57909 100644 --- a/base-linux/src/base/thread/thread_linux.cc +++ b/base-linux/src/base/thread/thread_linux.cc @@ -40,6 +40,11 @@ static void thread_start(void *) */ lx_sigaction(LX_SIGUSR1, empty_signal_handler); + /* + * Prevent children from becoming zombies. (SIG_IGN = 1) + */ + lx_sigaction(LX_SIGCHLD, (void (*)(int))1); + Thread_base::myself()->entry(); sleep_forever(); } diff --git a/base-linux/src/core/thread_linux.cc b/base-linux/src/core/thread_linux.cc index a5be5a20d..8306ace17 100644 --- a/base-linux/src/core/thread_linux.cc +++ b/base-linux/src/core/thread_linux.cc @@ -32,6 +32,11 @@ static void thread_start(void *) */ lx_sigaction(LX_SIGUSR1, empty_signal_handler); + /* + * Prevent children from becoming zombies. (SIG_IGN = 1) + */ + lx_sigaction(LX_SIGCHLD, (void (*)(int))1); + Thread_base::myself()->entry(); sleep_forever(); } diff --git a/base-linux/src/platform/linux_syscalls.h b/base-linux/src/platform/linux_syscalls.h index aa81d7305..3cc473dca 100644 --- a/base-linux/src/platform/linux_syscalls.h +++ b/base-linux/src/platform/linux_syscalls.h @@ -314,6 +314,7 @@ inline int lx_stat(const char *path, struct stat64 *buf) enum { LX_SIGUSR1 = 10, /* used for cancel-blocking mechanism */ + LX_SIGCHLD = 17, /* child process changed state, i.e., terminated */ LX_SIGCANCEL = 32, /* accoring to glibc, this equals SIGRTMIN, used for killing threads */ }; diff --git a/base-linux/src/platform/lx_hybrid.cc b/base-linux/src/platform/lx_hybrid.cc index caf3d6c26..02c1d326a 100644 --- a/base-linux/src/platform/lx_hybrid.cc +++ b/base-linux/src/platform/lx_hybrid.cc @@ -167,6 +167,11 @@ static void adopt_thread(Thread_meta_data *meta_data) */ lx_sigaction(LX_SIGUSR1, empty_signal_handler); + /* + * Prevent children from becoming zombies. (SIG_IGN = 1) + */ + lx_sigaction(LX_SIGCHLD, (void (*)(int))1); + /* assign 'Thread_meta_data' pointer to TLS entry */ pthread_setspecific(tls_key(), meta_data);