UNIX question

Al Brumm ahb at ccice5.UUCP
Thu Dec 12 09:49:00 AEST 1985


In article <156 at uw-june> pjs at uw-june (Philip J. Schneider) writes:
>My question: Is there any way to kill off these zombies so I can get
>	     more processes ?  Or, failing that, is there any other
>	     way to do what I want ?

A clean way to handle this problem on Sys3 was to use the following
system call in the parent process:
	signal(SIGCLD, SIG_IGN);

Then when a child process exited, a zombie would not be created.
Note that this would not allow you to examine the child's exit
status.  However, you could examine the exit status by doing the 
following:
	int
	sigcld()
	{
		int pid, status;
		pid = wait(&status);
		.
		. (do stuff)
		.
	}
	main()
	{
		int	(*sigcld)();

		signal(SIGCLD, sigcld);
	}

The example immediately above is also possible in 4.2BSD,
only SIGCLD is called SIGCHLD.

Then again, there is always the double fork() trick which goes
something like this:
	if (fork()) {			/* parent */
		wait((int *)0);		/* no zombies please */
	}
	else {
		if (fork()) {		/* child */
			exit(0);	/* satisfy parent's wait */
		}
		else {			/* grandchild */
			do_stuff();		/* since my parent exit'ed */
			.			/* I am inherited by init */
			.
			.
		}
	}
The above trick is used quite heavily by the UNET servers.



More information about the Comp.unix.wizards mailing list