Why does fork sometimes return parent and sometimes child

forkprocess

When running the fork call to create a new process, if it succeed it returns either 0 (the child) or the parent.

I didn't get the idea behind this. Why doesn't fork just always return child or always parent?

Best Answer

When you fork(), the code that’s running finds itself running in two processes (assuming the fork is successful): one process is the parent, the other the child. fork() returns 0 in the child process, and the child pid in the parent process: it’s entirely deterministic.

This is how you can determine, after the fork(), whether you’re running in the parent or the child. (And also how the parent knows the child pid — it needs to wait on it at some point.)

In a little more detail:

  • the future parent process calls fork();
  • the kernel creates a new process, which is the child, and sets various things up appropriately — but both processes are running the same code and are “waiting” for a return from the same function;
  • both processes continue running (not necessarily straight away, and not necessarily simultaneously, but that’s besides the point):
    • fork() returns 0 to the child process, which continues and uses that information to determine that it’s the child;
    • fork() returns the child pid to the parent process, which continues and uses that information to determine that it’s the parent.