Wednesday, June 23, 2010

fork: basic child processes - creating, waiting for and ending children

Here is basic example program demonstrating the use of forks and child processes.

The key points are;
  • Children processes are created with a call to fork, Fork returns:
    • A number less than 0(the Error code) on an error.
    • A number equal to 0 in the thread.
    • A number greater than to 0(the childs pid) in the main process.
  • A call to getpid() will return the pid of the child or parent process.

  • Keep in might the differences between a thread and process. The fundamental difference is that a thread shares all regions of memory except the stack where as a process shares none. In general memory is copied over the the child process as needed by the kernel.

//complie with; g++ fork.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>

struct BaseA
{
 pid_t pid;
 int number;
};

//The thread core...
void child_worker(BaseA* data)
{
 data->pid = getpid();

 for(int i = 0; i < 10; i++)
   {
     printf("Child %d @ %d \n", data->pid, data->number++);
     sleep(rand()%3000/1000);
   }

 printf("Child %d DONE!\n", data->pid);
 exit(0);
}

int main()
{
 srand(time(NULL));

 pid_t childPid;
 BaseA data;

 //setup the process
 data.number = 1;

 // create the threads
 childPid = fork();
 if (childPid >= 0) // fork ok
    if (childPid == 0) // Am I the kid
       child_worker(&data);
 childPid = fork();
 if (childPid >= 0) // fork ok
    if (childPid == 0) // Am I the kid
       child_worker(&data);

 //wait for all kids to complete
 wait(NULL);
 wait(NULL);

 printf("Parent %d DONE!\n", data.number);

 exit(0);
}

No comments:

Post a Comment