Question

I have found examples of how to fork multiple children by having something like this:

if ( fork() = 0 ) {
    //In child
} else {
    if ( fork() = 0 ) {
       //in second child

But if I don't know how many children I am going to need, how might I do this?

For instance, if I have a linked list of commands, and I want to fork and exec for each of them... So I guess I need to know which child it is as well...

Was it helpful?

Solution

Taking you at your word that you need to do this for a linked list:

linked_list_of_commands_t *node = root;
while (node != NULL) {
   int pid = fork();
   if (pid == -1) {
       break; // handle error
   } else if (pid == 0) {
       // child
       execv(node->command, node->argv);
       exit(1); // execv should not return, but just in case the execv call fails
   } else {
       node = node->next;
   }
}

This will launch a separate process for every item in the list.

OTHER TIPS

But the number of routines would have to be fixed, even if the execution over those branches is unbounded. So what about a while loop with some sort of switch statement logic to each routine?

How about

for (i=0; i< 1000; i++) {
    pid = fork();
    if (pid) {
        // Error handling for pid==-1 
        break;
    }
    // Some logic dependent on value of 'i'
}
for(i = 0; i < num_children_to_spawn(); ++i) {
    pid_t pid = fork();
    if (pid == -1) {
        exit(-1); /* error */
    } else if (pid == 0) {
        /* child */
        do_child_things();
        break;
    } else {
        /* parent */
    }
}

Note that I didn't use a switch() because it would make it more cumbersome to break out of the loop.

pid_t children_pids[MAX_CHILDREN];
int last_child_index = 0;
for (int i=0; i < num_wanted_children; i++) {
  pid_t pid = fork();
  if (pid == 0)
    // in child
  else
    children_pids[last_child_index++] = pid;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top