On Sat 12 Aug 2023 at 16:05:34 +0200, Rhialto wrote:
> On Sat 12 Aug 2023 at 15:22:56 +0200, Rhialto wrote:
> > Or, alternatively, a proper signal handler for SIGCHLD could be set up.
> 
> I propose something like this.
> It worked for me in a quick test, also when I changed the style of my
> .xinitrc file from my usual
> 
>     xterm &
>     exec ctwm
> 
> to
> 
>     ctwm &
>     exec xterm

I meant that the other way around. The bug shows in the first case.
I've also updated it slightly to save and restore errno.

=== modified file 'signals.c'
--- old/signals.c       2018-11-18 22:08:49 +0000
+++ new/signals.c       2023-08-12 15:03:42 +0000
@@ -8,6 +8,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <sys/wait.h>
+#include <errno.h>
 
 #include "ctwm_shutdown.h"
 #include "signals.h"
@@ -16,6 +18,7 @@
 /* Our backends */
 static void sh_restart(int signum);
 static void sh_shutdown(int signum);
+static void sh_sigchld(int signum);
 
 
 // Internal flags for which signals have called us
@@ -46,9 +49,8 @@
        // die...
        signal(SIGALRM, SIG_IGN);
 
-       // This should be set by default, but just in case; explicitly don't
-       // leave zombies.
-       signal(SIGCHLD, SIG_IGN);
+       // Explicitly don't leave zombies.
+       signal(SIGCHLD, sh_sigchld);
 
        return;
 }
@@ -123,3 +125,18 @@
        SignalFlag = sig_shutdown = true;
 }
 
+/**
+ * Handle SIGCHLD so we don't leave zombie child processes.
+ * SIG_IGN'ing it would cause system(3) to malfunction.
+ */
+static void
+sh_sigchld(int signum)
+{
+       pid_t pid;
+       int old_errno = errno;
+
+       while((pid = waitpid(-1, NULL, WNOHANG)) > 0)
+               ;
+
+       errno = old_errno;
+}

-Olaf.
-- 
___ Olaf 'Rhialto' Seibert                            <rhialto/at/falu.nl>
\X/ There is no AI. There is just someone else's work.           --I. Rose

Attachment: signature.asc
Description: PGP signature

Reply via email to