George
George

Reputation: 193

Create multiple child processes in UNIX

I want to write an UNIX program that creates N child processes, so that the first process creates one child process, then this child creates only one process that is its child, then the child of the child creates another child etc. Here's my code:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int N=3;
    int i=0;

    printf("Creating %d children\n", N);
    printf("PARENT PROCESS\nMy pid is:%d \n",getpid() );
    for(i=0;i<N;i++)
    {
        pid_t pid=fork();
        if(pid < 0)
        {
             perror("Fork error\n");
             return 1;  
        }
        else if (pid==0) /* child */
        {
            printf("CHILD My pid is:%d  my parent pid is %d\n",getpid(), getppid() );
        }
        else /* parrent */
        {
             exit(0);
        }

    }
    return 0;
}

The output that I expect is in the form:

Creating 3 children
PARENT PROCESS
My pid is 1234
CHILD My pid is 4567 my parent pid is 1234
CHILD My pid is 3528 my parent pid is 4567
CHILD My pid is 5735 my parent pid is 3528

The output I get in the terminal is

Creating 3 children
PARENT PROCESS
My pid is:564
CHILD My pid is:5036  my parent pid is 564

User@User-PC ~
$ CHILD My pid is:4804  my parent pid is 1
CHILD My pid is:6412  my parent pid is 4804

The problem is that the program doesn't seem to terminate. I should use Ctrl+C to get out of the terminal, which is not normal. Can you help me to fix this issue?

Upvotes: 3

Views: 4784

Answers (3)

user58697
user58697

Reputation: 7923

The proposed cure is correct, but the reason stated is wrong. Children do not die with the parent. The line

CHILD My pid is:4804  my parent pid is 1

clearly indicates that by the time child called getppid() its parent is already dead, and the child has been reparented to init (pid 1).

The real problem is that after the child prints its message, it continues to execute the loop, producing more children, making your program into a fork bomb.

Upvotes: 0

albttx
albttx

Reputation: 3804

try to wait the process with wait(NULL);

pid_t child = fork();
if (child == -1)
{
  puts("error");
  exit(0);
}
else if (child == 0)
{
 // your action
}
else
{
 wait(&child);
 exit(0);
}

so your father will wait the child process to exit

Upvotes: 0

Klas Lindb&#228;ck
Klas Lindb&#228;ck

Reputation: 33283

The children die when the parent dies. In your case the parent exits before all the children have been created.

Try waiting for the children before exiting:

    else /* parrent */
    {
        int returnStatus;    
        waitpid(pid, &returnStatus, 0);  // Parent process waits for child to terminate.
         exit(0);
    }

Upvotes: 3

Related Questions