Avoid non-portable signal(SIGCHLD, SIG_IGN)
Joerg Wunsch
j at uriah.heep.sax.de
Sun Apr 13 00:52:00 CDT 2003
As Alexandre Julliard wrote:
> The fact that the macro exists doesn't mean it works. Most Linux
> kernels don't support SA_NOCLDWAIT, even though the symbol may be
> defined in the headers.
That sounds to be a very stupid mistake to me. Why would one define
something one doesn't support? But OK, that's nothing we can change.
> I don't have the Posix standard, but at least according to the
> single Unix spec using SIG_IGN is just as standard as SA_NOCLDWAIT,
> and a quick grep of the FreeBSD sources seems to indicate that it
> should work. Did I miss something?
signal() is not part of Posix at all, IIRC. Sure, SIG_IGN has always
been defined, but its effect on SIGCHLD didn't used to be defined.
When i implemented the FreeBSD SA_NOCLDWAIT feature, i purposely
decided to not also implement the SIG_IGN irregularity (SIG_IGN means
that the /signal/ is being ignored, but never implied any other
side-effect in the past), to remain backwards compatible with the BSD
behaviour.
It's still that way, see the following short test program:
j at uriah 720% cat foo.c
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
void
createchild(void)
{
if (fork() == 0) {
exit(0);
}
}
int
main(void)
{
createchild();
createchild();
createchild();
sleep(1);
system("ps");
sleep(2);
return 0;
}
j at uriah 721% make foo
cc -O -pipe foo.c -o foo
j at uriah 722% ./foo
PID TT STAT TIME COMMAND
...
0 p3 ZW+ 0:00.00 (foo)
0 p3 ZW+ 0:00.00 (foo)
0 p3 ZW+ 0:00.00 (foo)
992 p3 Ss 0:02.13 -tcsh (tcsh)
12287 p3 S+ 0:00.00 ./foo
12291 p3 S+ 0:00.00 sh -c ps
12292 p3 R+ 0:00.00 ps
...
Of course, now that i see that SUSP indeed standardized this oddness,
i might change my opinion. Anyway, as demonstrated above,
signal(SIGCHLD, SIG_IGN) doesn't work on FreeBSD the way you would
expect it to work. So Gerald, please at least integrate the patch
into the FreeBSD port.
--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL
http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
More information about the wine-devel
mailing list