Skip to content
Advertisement

Irregular result in zombie example

I have problems with understanding the behavior of this code:

#include <stdio.h>
#include <stdlib.h>
int main() {
int nr;
nr = fork();
  if (nr == 0) {
    /* Child process */
    printf("Child process, fork return value %dn", nr);
    exit(0);
  } else {
    /* Parent process */
    printf("Parent process, fork return value: %dn", nr);
    exit(0);
  }
}

When running in a Unix shell I get this result:

Parent process, fork return value: 343
Child process, fork return value: 0

But sometimes its only giving me this result without any shell prompt:

Child process, fork return value: 0

I know it can be solved with wait() function in parent process. But I like to know:

Why is result irregular? Could someone please explain what happening? Child process becomes a zombie, but why do not parents process printf() function call run?

Advertisement

Answer

There are 2 issuse to concider: 1) there is stdout buffering that you might want to flush

fflush(stdout);

2) multitasking can sometimes execute the stuff in an unexpected order I get something like this when that happens:

/tmp$ ./a.out
Parent process, fork return value: 24049
/tmp$ Child process, fork return value 0

as you can see the prompt is in the beginning of the child process output, it’s not missing altogether it’s just not where you expect it to be.

With this code I tried several times bit never had the prompt in teh output lines of the child or parent:

#include <stdio.h>
#include <stdlib.h>
int main() {
int nr;
nr = fork();
  if (nr == 0) {
    /* Child process */
    printf("Child process, fork return value %dn", nr);
    fflush(stdout);
    exit(0);
  } else {
    /* Parent process */
    printf("Parent process, fork return value: %dn", nr);
    fflush(stdout);
    sleep(1);
    exit(0);
  }
}
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement