What happens after the parent of zombie process terminates?
Asked Answered
D

1

6

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?

Dwelt answered 21/6, 2013 at 13:34 Comment(1)
init process become parent of child process., init flush entry from process tablePagoda
P
10

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;
}
Prevision answered 21/6, 2013 at 13:56 Comment(4)
Since child has already terminated, will the SIGCHLD signal still be generated? I thought that it is generated, when the child terminates (correct me if I'm wrong).Dwelt
@Dwelt Good question, probably not. Can't say because I know of no way to adopt a process in a user process. Either way init cleans up the child discarding it's exit status. The whole adoption by init was introduced to make sure orphan zombies don't stay in the system.Prevision
+1, for the program. It really explains, what happens. However, I'm interested in how this is implemented. And if this is implementation specific, or is there a standard way.Dwelt
@Dwelt It's Unix and Unix-like standard. And about SIGCHLD - init periodically waits for all it's children to clean them up if necessary. From: en.wikipedia.org/wiki/Zombie_processPrevision

© 2022 - 2024 — McMap. All rights reserved.