diff options
-rw-r--r-- | sys/kern/kern_exit.c | 6 | ||||
-rw-r--r-- | sys/kern/kern_sig.c | 9 | ||||
-rw-r--r-- | sys/sys/proc.h | 1 |
3 files changed, 10 insertions, 6 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 0d06804..c9bf40b 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -368,10 +368,10 @@ exit1(td, rv) /* * Notify parent that we're gone. If parent has the PS_NOCLDWAIT - * flag set, notify process 1 instead (and hope it will handle - * this situation). + * flag set, or if the handler is set to SIG_IGN, 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 | PS_CLDSIGIGN)) { struct proc *pp = p->p_pptr; PROC_UNLOCK(pp); proc_reparent(p, initproc); diff --git a/sys/kern/kern_sig.c b/sys/kern/kern_sig.c index 0011039..16c6fed 100644 --- a/sys/kern/kern_sig.c +++ b/sys/kern/kern_sig.c @@ -304,8 +304,7 @@ do_sigaction(p, sig, act, oact, old) 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 @@ -318,6 +317,10 @@ do_sigaction(p, sig, act, oact, old) p->p_procsig->ps_flag |= PS_NOCLDWAIT; } else p->p_procsig->ps_flag &= ~PS_NOCLDWAIT; + if (ps->ps_sigact[_SIG_IDX(SIGCHLD)] == SIG_IGN) + p->p_procsig->ps_flag |= PS_CLDSIGIGN; + else + p->p_procsig->ps_flag &= ~PS_CLDSIGIGN; } /* * Set bit in p_sigignore for signals that are set to SIG_IGN, @@ -499,7 +502,7 @@ execsigs(p) /* * Reset no zombies if child dies flag as Solaris does. */ - p->p_procsig->ps_flag &= ~PS_NOCLDWAIT; + p->p_procsig->ps_flag &= ~(PS_NOCLDWAIT | PS_CLDSIGIGN); if (ps->ps_sigact[_SIG_IDX(SIGCHLD)] == SIG_IGN) ps->ps_sigact[_SIG_IDX(SIGCHLD)] = SIG_DFL; PROC_UNLOCK(p); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 1e6a45d..ff682b3 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -106,6 +106,7 @@ struct procsig { #define PS_NOCLDWAIT 0x0001 /* No zombies if child dies */ #define PS_NOCLDSTOP 0x0002 /* No SIGCHLD when children stop. */ +#define PS_CLDSIGIGN 0x0004 /* The SIGCHLD handler is SIG_IGN. */ /* * pargs, used to hold a copy of the command line, if it had a sane length. |