System V and SIGCLD
Doug Gwyn
gwyn at brl-smoke.ARPA
Sat May 10 08:14:54 AEST 1986
In article <709 at cheviot.uucp> lindsay at cheviot.newcastle.ac.uk (Lindsay F. Marshall) writes:
>The following code goes into an infinite loop on System V :-
>
> trap(sig)
> int sig;
> {
> printf("trapped SIGCLD\n");
> signal(SIGCLD, trap); /* reset handler */
> }
>
> main()
> {
> signal(SIGCLD, trap);
> switch ( fork() )
> {
> case 0 : /* child */
> sleep(5);
> exit(0);
> case -1 :
> printf("error\n");
> exit(1);
> default :
> pause();
> }
> exit(0);
> }
>
>The problem is that resetting the SIGCLD trap inside the handler causes the
>signal to be raised again and the handler to be re-entered...... This
>is not documented in the manual page and seems to me to be a bug as if you
>do not reset the handler the system seems to set it to SIG_DFL, meaning that
>you will loose any SIGCLD signals between the handler's exit and your getting
>a chance to call signal again. Anyone have any thoughts, information etc. on
>this problem??
The reason SIGCLD keeps recurring is that you continue to have an
unwaited-for terminated child process. A wait() must be done to
lay the zombie to rest.
As to the window of vulnerability: Yes, all generally-available
UNIXes except 4.2BSD have this problem. AT&T has said that they
plan to change to Berkeley-like "reliable signals" in some future
release of UNIX System V.
More information about the Comp.unix.wizards
mailing list