I'm just curious, what happens to zombie process, if it's parent doesn't care to wait for it.
Suppose, we've a parent and a child. Child terminates before parent does.
From APUE:
The kernel keeps a small amount of information for every terminating process...Minimally
this information consists of the process ID, the termination status of the process....
Parent is required to fetch this information using waitpid()
.
But if, parent exits without waiting for child, what happens:
Does the kernel delete this information (certainly it's of no use)?
Or, it keeps collecting this junk?
Is this implementation specific?
Or, is there a standard way to deal with this situation?
Orphan processes are automatically adopted by init
which has a standard SIGCHLD
handler that just discards any exit status of a dead process.
In your case if the parent of a zombie process dies the zombie orphan will be adopted by init and cleaned up.
The following code tests this:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main() {
pid_t child_pid;
if (child_pid = fork()) { // fork a child, child will exit straight away
char name[128];
sprintf(name, "/proc/%d/stat", child_pid);
char line[2048];
// read childs /proc/pid/stat, field 3 will give its status
FILE * fp = fopen(name, "r");
while (fgets(line, sizeof(line), fp))
puts(line);
fclose(fp);
usleep(5000000);
// by now the child will have exited for sure, repeat
fp = fopen(name, "r");
while (fgets(line, sizeof(line), fp))
puts(line);
fclose(fp);
// make another child to repeat the process and exit the parent
if (!fork()) {
usleep(5000000);
// both parent and child will have exited by now
fp = fopen(name, "r");
// this should fail because init has already cleaned up the child
if (!fp) {
perror("fopen");
return -1;
}
while (fgets(line, sizeof(line), fp))
puts(line);
fclose(fp);
}
}
return 0;
}