Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 20 Apr 2009 18:46:54 +0300
From:      Kostik Belousov <kostikbel@gmail.com>
To:        Alan Ferrency <alan@pair.com>
Cc:        freebsd-bugs@freebsd.org, gavin@freebsd.org, freebsd-standards@freebsd.org, Jilles Tjoelker <jilles@stack.nl>
Subject:   Re: bin/108390: [libc] [patch] wait4() erroneously waits for all children when SIGCHLD is SIG_IGN [regression]
Message-ID:  <20090420154654.GC3014@deviant.kiev.zoral.com.ua>
In-Reply-To: <20090420112723.S1321@smx2.pair.com>
References:  <200904161242.n3GCgG4u063936@freefall.freebsd.org> <20090419195409.GY3014@deviant.kiev.zoral.com.ua> <20090420112723.S1321@smx2.pair.com>

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

--wg2zgDM1gLxA7pbN
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Mon, Apr 20, 2009 at 11:40:08AM -0400, Alan Ferrency wrote:
> >Further check on Solaris revealed that for the case where SIGCHLD is
> >ignored, wait4() returned -1/ECHLD, conforming to the FreeBSD behaviour
> >of reparenting to init.
>=20
> If I'm interpreting Jilles' notes about this proposed patch, it seems
> like this would solve our primary problem.
>=20
> That is: we already receive a -1/ECHLD when we call wait4pid() as
> expected, but we don't receive it in a timely manner if there are
> other child processes still running.  If this patch causes wait4pid()
> to return immediately when a nonexistent (exited) child PID is
> specified, that would meet our expectations and preferences.
Yes, this is what happens after the patch.
I committed the change today.

>=20
> Regarding SA_NOCLDWAIT: it was previously my understanding that
> SA_NOCLDWAIT and igoring SIGCHLD affect two different aspects of child
> process management.  On a previous occasion when I looked into the
> behavior of SA_NOCLDWAIT, it wasn't even implemented on Linux yet; but
> obviously, ignoring SIGCHLD was supported.
>=20
> Thanks for the patch,=20
> Alan Ferrency
> pair Networks, Inc.
>=20
> >Unless further comments are given, I will commit this in several days:
> >
> >diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c
> >index 4255734..c35c6f2 100644
> >--- a/sys/kern/kern_exit.c
> >+++ b/sys/kern/kern_exit.c
> >@@ -504,13 +504,13 @@ exit1(struct thread *td, int rv)
> >		proc_reparent(p, initproc);
> >		p->p_sigparent =3D SIGCHLD;
> >		PROC_LOCK(p->p_pptr);
> >+
> >		/*
> >-		 * If this was the last child of our parent, notify
> >-		 * parent, so in case he was wait(2)ing, he will
> >+		 * Notify parent, so in case he was wait(2)ing or
> >+		 * executiing waitpid(2) with our pid, he will
> >		 * continue.
> >		 */
> >-		if (LIST_EMPTY(&pp->p_children))
> >-			wakeup(pp);
> >+		wakeup(pp);
> >	} else
> >		mtx_unlock(&p->p_pptr->p_sigacts->ps_mtx);
> >
> >

--wg2zgDM1gLxA7pbN
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEARECAAYFAknsmO4ACgkQC3+MBN1Mb4iWdQCdH+w7GKVa9G4FR1g6/bKVxLmL
KHUAoOHOecTUsu29Bu1xronT9WZKgjXm
=Ovvv
-----END PGP SIGNATURE-----

--wg2zgDM1gLxA7pbN--



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