1

次のようなものを使用して、複数の子をフォークする方法の例を見つけました。

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

しかし、何人の子供が必要なのかわからない場合、どうすればよいでしょうか?

たとえば、コマンドのリンクされたリストがあり、それらのそれぞれに対してフォークして実行したい場合...したがって、それがどの子であるかを知る必要があると思います...

4

5 に答える 5

5

リンクされたリストに対してこれを行う必要があることをあなたの言葉で伝えます:

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

これにより、リスト内のすべてのアイテムに対して個別のプロセスが開始されます。

于 2009-09-22T22:43:58.783 に答える
1

ただし、これらの分岐に対する実行が無制限であっても、ルーチンの数を固定する必要があります。では、各ルーチンに対してある種の switch ステートメント ロジックを使用した while ループはどうでしょうか。

于 2009-09-22T22:12:43.637 に答える
1

どうですか

for (i=0; i< 1000; i++) {
    pid = fork();
    if (pid) {
        // Error handling for pid==-1 
        break;
    }
    // Some logic dependent on value of 'i'
}
于 2009-09-22T22:14:50.447 に答える
1
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 */
    }
}

breakループから抜け出すのが面倒になるため、switch() を使用しなかったことに注意してください。

于 2009-09-22T22:15:23.553 に答える
1
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;
}
于 2009-09-22T22:16:16.603 に答える