nbd-client: do not leave child processes in the zombie state
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 15 Jun 2012 23:43:23 +0000 (03:43 +0400)
committerWouter Verhelst <w@uter.be>
Thu, 21 Jun 2012 19:53:06 +0000 (21:53 +0200)
Change SIGCHLD handler to SIG_DFL with SA_NOCLDWAIT flag set, to avoid
transforming child processes into zombies when they terminate.  Since
the main process is inevitably blocked in NBD_DO_IT ioctl at the time
when child processes terminate, this is the simplest way to get rid of
zombie processes.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
Signed-off-by: Wouter Verhelst <w@uter.be>
nbd-client.c

index 7a526b9699c3cf64e51486f7e72b9b2c56a580f5..2321e7bbd6df2a32041f069746a22bb1051e9fe5 100644 (file)
@@ -35,6 +35,7 @@
 #include <stdlib.h>
 #include <sys/mount.h>
 #include <sys/mman.h>
+#include <signal.h>
 #include <errno.h>
 #include <getopt.h>
 #include <stdarg.h>
@@ -571,6 +572,16 @@ int main(int argc, char *argv[]) {
 #endif
        do {
 #ifndef NOFORK
+#ifdef SA_NOCLDWAIT
+               struct sigaction sa;
+
+               sa.sa_handler = SIG_DFL;
+               sigemptyset(&sa.sa_mask);
+               sa.sa_flags = SA_NOCLDWAIT;
+               if (sigaction(SIGCHLD, &sa, NULL) < 0)
+                       err("sigaction: %m");
+#endif
+
                if (!fork()) {
                        /* Due to a race, the kernel NBD driver cannot
                         * call for a reread of the partition table