From owner-freebsd-hackers Tue Jun 12 0:53:41 2001 Delivered-To: freebsd-hackers@freebsd.org Received: from boco.fee.vutbr.cz (boco.fee.vutbr.cz [147.229.9.11]) by hub.freebsd.org (Postfix) with ESMTP id 6492237B405 for ; Tue, 12 Jun 2001 00:53:36 -0700 (PDT) (envelope-from cejkar@dcse.fee.vutbr.cz) Received: from kazi.dcse.fee.vutbr.cz (kazi.dcse.fee.vutbr.cz [147.229.8.12]) by boco.fee.vutbr.cz (8.11.4/8.11.3) with ESMTP id f5C7rTD47995 (using TLSv1/SSLv3 with cipher EDH-RSA-DES-CBC3-SHA (168 bits) verified OK); Tue, 12 Jun 2001 09:53:29 +0200 (CEST) Received: (from cejkar@localhost) by kazi.dcse.fee.vutbr.cz (8.11.3/8.11.3) id f5C7rNw79853; Tue, 12 Jun 2001 09:53:23 +0200 (CEST) Date: Tue, 12 Jun 2001 09:53:23 +0200 From: Cejka Rudolf To: David Malone Cc: Peter Wemm , Matt Dillon , Terry Lambert , hackers@FreeBSD.ORG Subject: Re: signal(SIGCHLD, SIG_IGN) patch solving SUSv2 compatibility issue Message-ID: <20010612095323.A72009@dcse.fee.vutbr.cz> References: <200106101845.f5AIje014790@earth.backplane.com> <20010611002050.362CE380E@overcee.netplex.com.au> <20010611115806.A53216@walton.maths.tcd.ie> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5i In-Reply-To: <20010611115806.A53216@walton.maths.tcd.ie>; from dwmalone@maths.tcd.ie on Mon, Jun 11, 2001 at 11:58:06AM +0100 Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.ORG David Malone wrote (2001/06/11): > On Sun, Jun 10, 2001 at 05:20:50PM -0700, Peter Wemm wrote: > > I agree totally. This should have been done ages ago, I've been burned on > > it a few times, but never badly enough to go fix it. > > I've committed this - I'll let Matt do the MFC when he feels ready. Thanks for this commit, but it works exactly in the way, which I wanted to avoid. It is something like "partially submitted and not approved by me". Please, could you look once again on it? Please please please... Thanks. ;-) - Hunk #1 from commit adds PS_NOCLDWAIT when SIG_IGN is used for SIGCHLD, so if I use sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = SIG_IGN; sigaction(SIGCHLD, &sa, NULL); sigaction(SIGCHLD, NULL, &so); I get additional flag SA_NOCLDWAIT in so.sa_flags. None of tested systems (Solaris, Unixware, Irix, Linux, Aix) works in this way. - If hunk #1 is applied, I see hunk #2 (resetting SIG_IGN to SIG_DFL for SIGCHLD) as almost unnecessary, because it is just cosmetic change now and behavior in exec() is very different among various systems. - (And I have found another bug in my original patch. Three code lines and two bad bugs... :-( :-) Here are patches for current -current (... which I had to do in the first posting). These should change the behavior as is in Solaris, where flags are not added and SIGCHLD is resetted to SIG_DFL after an exec(). I'm testing these patches on my -stable production backup server running amanda and up to now without any problem. # Back out hunk #1 from applied commit --- sys/kern/kern_sig.c.orig Mon Jun 11 21:47:29 2001 +++ sys/kern/kern_sig.c Tue Jun 12 07:42:42 2001 @@ -293,8 +293,7 @@ p->p_procsig->ps_flag |= PS_NOCLDSTOP; else p->p_procsig->ps_flag &= ~PS_NOCLDSTOP; - if ((act->sa_flags & SA_NOCLDWAIT) || - ps->ps_sigact[_SIG_IDX(SIGCHLD)] == SIG_IGN) { + if (act->sa_flags & SA_NOCLDWAIT) { /* * Paranoia: since SA_NOCLDWAIT is implemented * by reparenting the dying child to PID 1 (and # Add test for SIG_IGN to exit1() --- sys/kern/kern_exit.c.orig Mon Jun 11 21:47:35 2001 +++ sys/kern/kern_exit.c Tue Jun 12 07:41:22 2001 @@ -341,7 +341,8 @@ * flag set, notify process 1 instead (and hope it will handle * this situation). */ - if (p->p_pptr->p_procsig->ps_flag & PS_NOCLDWAIT) { + if ((p->p_pptr->p_procsig->ps_flag & PS_NOCLDWAIT) + || p->p_pptr->p_sigacts->ps_sigact[_SIG_IDX(SIGCHLD)] == SIG_IGN) { struct proc *pp = p->p_pptr; proc_reparent(p, initproc); /* # And this is patch for question from my first posting: ... Why? I know # that sa_handler and sa_sigaction are the same pointer in an union, # but I think that "act->sa_handler" should be exchanged with # "(__sighandler_t *)act->sa_sigaction" for clarification purposes. --- sys/kern/kern_sig.c Tue Jun 12 07:42:42 2001 +++ sys/kern/kern_sig.c.new Tue Jun 12 08:16:12 2001 @@ -259,11 +259,11 @@ ps->ps_catchmask[_SIG_IDX(sig)] = act->sa_mask; SIG_CANTMASK(ps->ps_catchmask[_SIG_IDX(sig)]); if (act->sa_flags & SA_SIGINFO) { - ps->ps_sigact[_SIG_IDX(sig)] = act->sa_handler; - SIGADDSET(ps->ps_siginfo, sig); - } else { ps->ps_sigact[_SIG_IDX(sig)] = (__sighandler_t *)act->sa_sigaction; + SIGADDSET(ps->ps_siginfo, sig); + } else { + ps->ps_sigact[_SIG_IDX(sig)] = act->sa_handler; SIGDELSET(ps->ps_siginfo, sig); } if (!(act->sa_flags & SA_RESTART)) Thanks. -- Rudolf Cejka (cejkar@dcse.fee.vutbr.cz; http://www.fee.vutbr.cz/~cejkar) Brno University of Technology, Faculty of El. Engineering and Comp. Science Bozetechova 2, 612 66 Brno, Czech Republic To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message