navy.l
navy.l

Reputation: 41

I try to create a process using 'fork'

I'm start to studying the fork. while using the fork, I have some problems. I'm trying to create a single parent process with two child and two child trying to make each three grandchild. When I run my code, unlike my expectations, so many child and grandchild come out.

Here my code:

int main()
{
    int i, j, rev;

    for(i=0;i<2;i++)
    {
        if((rev=fork())<0) { printf("fork() error\n"); exit(-1); }
        else if(rev==0)
        {
            printf("child %d %d \n",getpid(),getppid());

            for(j=0;j<3;j++)
            {
                if((rev=fork()) <0) { printf("fork() error\n"); exit(-1); }
                else if(rev == 0)
                {
                    printf("grandch %d %d \n",getppid(),getpid());
                    exit(0);
                }
            }

        }
    }
    printf("parent %d %d \n",getpid(),getppid());
    exit(0);
}

How can I correct this code?

Upvotes: 4

Views: 575

Answers (2)

dbush
dbush

Reputation: 224082

The section of code that runs for the child processes doesn't exit. As a result, they continue on to run more iterations of the outer loop which only the parent process is supposed to run, so they spawn more children.

You need to call exit, or better yet _exit, so that the children don't do that:

int main()
{
    int i, j, rev;

    for(i=0;i<2;i++)
    {
        if((rev=fork())<0) { printf("fork() error\n"); exit(-1); }
        else if(rev==0)
        {
            printf("child %d %d \n",getpid(),getppid());

            for(j=0;j<3;j++)
            {
                if((rev=fork()) <0) { printf("fork() error\n"); exit(-1); }
                else if(rev == 0)
                {
                    printf("grandch %d %d \n",getpid(),getppid());
                    _exit(0);
                }
            }

            sleep(1);      // stick around so the grandchild can print the parent pid
            _exit(0);      // exit the child
        }
    }
    printf("parent %d %d \n",getpid(),getppid());
    sleep(1);   // stick around so the child can print the parent pid
    exit(0);
}

Upvotes: 1

Shivansh Jagga
Shivansh Jagga

Reputation: 1861

One important example before using fork() statements :

//Calculate number of times hello is printed.
#include  <stdio.h>
#include  <sys/types.h>
int main()
{
    fork();
    fork();
    fork();
    printf("hello\n");
    return 0;
}

Number of times hello printed is equal to number of process created. Total Number of Processes = 2^n where n is number of fork system calls. So here n = 3, 2^3 = 8.

fork ();   // Line 1
fork ();   // Line 2
fork ();   // Line 3

       L1       // There will be 1 child process 
    /     \     // created by line 1.
  L2      L2    // There will be 2 child processes
 /  \    /  \   //  created by line 2
L3  L3  L3  L3  // There will be 4 child processes 
                // created by line 3

So if you are trying to make two child process and then three grand child follow something of this sort:

What you should do is something like this for two child processes

if(fork()) # parent
    if(fork()) #parent
    else # child2
else #child1

After you create process , you should check the return value. If you don't , the second fork() will be executed by both the parent process and the child process, so you have four processes.

If you want to create n child processes , just :

for (i = 0; i < n; ++i) {
    pid = fork();
    if (pid) {  //means pid is non-zero value, i.e, pid>0
        continue;
    } else if (pid == 0) {
        break;
    } else {
        printf("fork error\n");
        exit(1);
    }
}

Upvotes: 4

Related Questions