Произвольное количество детей от одного из родителей в C? - PullRequest
1 голос
/ 23 сентября 2009

Я нашел примеры того, как разветвлять нескольких детей, имея что-то вроде этого:

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

Но если я не знаю, сколько детей мне понадобится, как я могу это сделать?

Например, если у меня есть связанный список команд, и я хочу выполнить fork и exec для каждой из них ... Итак, я думаю, мне нужно знать, какой это дочерний элемент ...

Ответы [ 5 ]

5 голосов
/ 23 сентября 2009

Даю слово, что вам нужно сделать это для связанного списка:

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;
   }
}

Это запустит отдельный процесс для каждого элемента в списке.

1 голос
/ 23 сентября 2009
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;
}
1 голос
/ 23 сентября 2009

Как насчет

for (i=0; i< 1000; i++) {
    pid = fork();
    if (pid) {
        // Error handling for pid==-1 
        break;
    }
    // Some logic dependent on value of 'i'
}
1 голос
/ 23 сентября 2009
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 */
    }
}

Обратите внимание, что я не использовал switch (), потому что это сделает его более громоздким для break вне цикла.

1 голос
/ 23 сентября 2009

Но количество подпрограмм должно быть фиксированным, даже если выполнение над этими ветвями не ограничено. Так что насчет цикла while с какой-то логикой оператора switch для каждой подпрограммы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...