Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 10 Jun 2001 11:45:40 -0700 (PDT)
From:      Matt Dillon <dillon@earth.backplane.com>
To:        Cejka Rudolf <cejkar@dcse.fee.vutbr.cz>
Cc:        David Malone <dwmalone@maths.tcd.ie>, Terry Lambert <tlambert2@mindspring.com>, hackers@FreeBSD.ORG
Subject:   signal(SIGCHLD, SIG_IGN) patch solving SUSv2 compatibility issue
Message-ID:  <200106101845.f5AIje014790@earth.backplane.com>
References:   <20010610183637.A73238@dcse.fee.vutbr.cz>

next in thread | previous in thread | raw e-mail | index | archive | help

:...
:
: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 majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200106101845.f5AIje014790>