Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fork() in C program

Tags:

c

fork

pthreads

This is a question from recent GATE entrance exam.
A process executes the code

fork();  
fork();  
fork();  

The total number of child processes created is

(A) 3. (B) 4. (C) 7. (D) 8.

My answer was (A) 3.

My view is that after each fork(), 1 child process will be created and execution of parent will continue normally.

Unreliable answer (without any explanation) from coaching institutes were (C) 7.

I think they are treating that each fork will create a child process and a new parent process. And they are counting all the parent process as well. [I am not allowed to post image but my friend explained in a diagram, a tree with each left node forking down in two nodes. Therefore 4 parent node in left and 3 child node in right.] But the Question clearly mentions child process only. And also I don't think that parent process is newly created in forking.

Can someone explain some forking fundamentals, and a proper solution to above question please.

P.S. If programming language make any difference in concept of forking, then as per syllabus, this should be either C or C++ program.

like image 351
Abhinav Kulshreshtha Avatar asked Feb 15 '12 19:02

Abhinav Kulshreshtha


3 Answers

At the end of the third fork call, there will be a total of 8 processes. Out of these 8 processes, there will be 7 child processes and 1 parent process.

There are two important points to note while solving these type of problems:

  1. A fork() call returns twice, once in the parent and once in the child process. If fork is successful, it returns with a value of 0 in child process and with non-zero value(pid of child) in parent process.

  2. Both the child and parent process starts executing right after the fork call.

I have explained the above problem with the help of a diagram and also a video. I hope you find it useful.

fork example gate

fork example

like image 195
Shivam Mitra Avatar answered Oct 08 '22 20:10

Shivam Mitra


fork() results in both the original process and one child to start from that point in the code. Therefore you have this picture:

enter image description here

like image 40
Bernd Elkemann Avatar answered Oct 08 '22 20:10

Bernd Elkemann


I think there are 8 processes in total, or 7 descendents of the original, or 3 direct children of the original (the others are grand-children and great-grand-children).

  • After the first fork(), assuming no failures (throughout), there are two processes.
  • Each of those executes fork() again - so there are now four processes.
  • Each of those executes fork() again - so there are now eight processes.
like image 42
Jonathan Leffler Avatar answered Oct 08 '22 21:10

Jonathan Leffler