:...
:
:sigemptyset(&sa.sa_mask);                                         
:sa.sa_flags = 0;                 
:sa.sa_handler = SIG_IGN;              
:sigaction(SIGCHLD, &sa, NULL);                                
:
:zombies are still created in FreeBSD, which is against SUSv2.
:
:My citation was quoted directly from sigaction() page and not
:from signal() page. Unfortunately, I do not have access to POSIX,
:so I do not know if it is specified in SUSv2 only or if it is
:specified in both SUSv2 and in POSIX. I'm afraid that it is in both.
:However I think, that FreeBSD wants to be SUSv2 compliant too, or not?
:...

    I did some research and while I couldn't find the official POSIX
    spec, I did read the SUSv2 spec carefully and I looked at a lot of
    manual pages.

    I believe your change is correct.  We should disable zombie reaping
    if SIGCHLD is set to SIG_IGN.  This is, in fact, how most systems do
    it.  BSD is like the sickly child in some respects :-)

    Your (revised) patch, which I have reproduced below along with a 
    little cleanup, looks correct.  I compiled up a kernel with the
    revised patch and tested it, and it seems to work as advertised.

    I would say this should go into -current now.  I would be happy to
    do this, or David Malone can since he provided the fix to the original
    patch. 

    I would also recommend that we MFC the patch to -stable after a few days.
    It is highly unlikely to break anything.  I suppose I could take the
    heat for that :-)  Every major forking program I've ever written has had
    to set the sigaction flag *AND* set the signal handle to SIG_IGN to be
    portable, and while I probably won't stop, it would be nice to know that
    FreeBSD works both ways.

                                                -Matt

Index: kern_sig.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_sig.c,v
retrieving revision 1.72.2.6
diff -u -r1.72.2.6 kern_sig.c
--- kern_sig.c  2001/05/10 17:54:16     1.72.2.6
+++ kern_sig.c  2001/06/10 18:30:42
@@ -268,7 +268,9 @@
                                p->p_procsig->ps_flag |= PS_NOCLDSTOP;
                        else
                                p->p_procsig->ps_flag &= ~PS_NOCLDSTOP;
-                       if (act->sa_flags & SA_NOCLDWAIT) {
+                       if ((act->sa_flags & SA_NOCLDWAIT) ||
+                           ps->ps_sigact[_SIG_IDX(SIGCHLD)] == SIG_IGN
+                       ) {
                                /*
                                 * Paranoia: since SA_NOCLDWAIT is implemented
                                 * by reparenting the dying child to PID 1 (and
@@ -279,8 +281,9 @@
                                        p->p_procsig->ps_flag &= ~PS_NOCLDWAIT;
                                else
                                        p->p_procsig->ps_flag |= PS_NOCLDWAIT;
-                       } else
+                       } else {
                                p->p_procsig->ps_flag &= ~PS_NOCLDWAIT;
+                       }
                }
                /*
                 * Set bit in p_sigignore for signals that are set to SIG_IGN,
@@ -438,6 +441,8 @@
         * Reset no zombies if child dies flag as Solaris does.
         */
        p->p_procsig->ps_flag &= ~PS_NOCLDWAIT;
+       if (ps->ps_sigact[_SIG_IDX(SIGCHLD)] == SIG_IGN)
+               ps->ps_sigact[_SIG_IDX(SIGCHLD)] = SIG_DFL;
 }
 
 /*

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to