Orphaned processes are automatically accepted by init , which has a standard SIGCHLD handler that simply discards any exit status of a dead process.
In your case, if the parent zombie process dies, the zombie orphan will be accepted by init and cleaned up.
The following code checks 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; }
source share