System V and SIGCLD

Nigel Holder Marconi nwh at hrc63.UUCP
Fri May 9 01:49:19 AEST 1986


Relay-Version: version B 2.10.2 9/18/84; site hrc63.UUCP
Posting-Version: version B 2.10.2 9/18/84; site cheviot.uucp
Path: hrc63!ukc!cheviot!lindsay
From: lindsay at cheviot.uucp (Lindsay F. Marshall)
Newsgroups: net.unix-wizards
Subject: System V and SIGCLD
Message-ID: <709 at cheviot.uucp>
Date: 7 May 86 10:33:56 GMT
Date-Received: 8 May 86 06:26:52 GMT
Reply-To: lindsay at cheviot.newcastle.ac.uk (Lindsay F. Marshall)
Organization: U. of Newcastle upon Tyne, U.K.
Lines: 40
Xpath: ukc eagle

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??

------------------------------------------------------------------------------
Lindsay F. Marshall, Computing Lab., U of Newcastle upon Tyne, Tyne & Wear, UK
  ARPA  : lindsay%cheviot.newcastle.ac.uk at ucl-cs.arpa
  JANET : lindsay at uk.ac.newcastle.cheviot
  UUCP  : <UK>!ukc!cheviot!lindsay
-------------------------------------------------------------------------------



More information about the Comp.unix.wizards mailing list