I’m doing an assignment on fork(),exec() and related UNIX calls where I need to show the zombie state of a (child) process. Here’s the relevant piece of code:
pid = vfork(); //used vfork() for showing z state
if(pid>0)
{
(some sorting code)
execl("/bin/ps","/bin/ps","a",(char*)0);
}
What I expect is:
(child's output)
(parent's output)
(Output of the ps command where I then would be able to show a 'defunct' entry)
What I get is:
(child's output)
(parent's output)
No ps command output. Instead I get: Signal 17 (CHLD) caught by ps (procps version 3.2.8)
However, when sleep(int time) (some integer time in seconds) is inserted before the execl call, I get the desired output and no Signal errors are reported.
What’s happening here? Does ps becomes the new parent of the (as yet-zombie) child?
And why does the ps command not execute? What does sleep() do that makes ps to execute as required?
I’m new to POSIX/Linux programing so any relevance of this SIGCHLD signal with respect to my particular situation would be appreciated. Thanks!
I might be wrong, but I think what’s happening is this:
if, executingps.psis started,SIGCHLDis sent to the parent process because of the termination of the child (signals can be slow and unpredictable)SIGCHLDis delivered to the parent, who ignores it, and then control passes tops.