Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中从父级派生任意数量的子级?_C_Fork - Fatal编程技术网

在C中从父级派生任意数量的子级?

在C中从父级派生任意数量的子级?,c,fork,C,Fork,我已经找到了一些例子,说明了如何通过以下方式让多个孩子分岔: if ( fork() = 0 ) { //In child } else { if ( fork() = 0 ) { //in second child 但是如果我不知道我需要多少孩子,我该怎么做呢 例如,如果我有一个命令的链接列表,并且我想为每个命令执行fork和exec。。。所以我想我也需要知道它是哪个子级…但是例程的数量必须是固定的,即使这些分支上的执行是无界的。那么,对每个例程使用某种swit

我已经找到了一些例子,说明了如何通过以下方式让多个孩子分岔:

if ( fork() = 0 ) {
    //In child
} else {
    if ( fork() = 0 ) {
       //in second child
但是如果我不知道我需要多少孩子,我该怎么做呢


例如,如果我有一个命令的链接列表,并且我想为每个命令执行fork和exec。。。所以我想我也需要知道它是哪个子级…

但是例程的数量必须是固定的,即使这些分支上的执行是无界的。那么,对每个例程使用某种switch语句逻辑的while循环怎么样?

但是例程的数量必须是固定的,即使这些分支上的执行是无限的。那么,对于每个例程来说,一个带有某种开关语句逻辑的while循环怎么样

for (i=0; i< 1000; i++) {
    pid = fork();
    if (pid) {
        // Error handling for pid==-1 
        break;
    }
    // Some logic dependent on value of 'i'
}
(i=0;i<1000;i++)的
{
pid=fork();
如果(pid){
//pid==-1的错误处理
打破
}
//一些依赖于“i”值的逻辑
}
怎么样

for (i=0; i< 1000; i++) {
    pid = fork();
    if (pid) {
        // Error handling for pid==-1 
        break;
    }
    // Some logic dependent on value of 'i'
}
(i=0;i<1000;i++)的
{
pid=fork();
如果(pid){
//pid==-1的错误处理
打破
}
//一些依赖于“i”值的逻辑
}
for(i=0;i
请注意,我没有使用switch(),因为它会使
从循环中中断
更加麻烦。

for(I=0;Ipid_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;
}
pid_t pid=fork(); 如果(pid==-1){ 退出(-1);/*错误*/ }否则如果(pid==0){ /*孩子*/ 做孩子的事; 打破 }否则{ /*母公司*/ } }
请注意,我没有使用switch(),因为它会使
从循环中中断
更加麻烦。

pid\t children\u pids[MAX\u children];
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;
}
int last_child_index=0; for(int i=0;i
pid_t children_pid[MAX_children];
int last_child_index=0;
for(int i=0;i
让您了解您需要为链接列表执行的操作:

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

这将为列表中的每个项目启动单独的流程

让您了解您需要为链接列表执行的操作:

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


这将为列表中的每个项目启动单独的流程

我发布了一个包含骨架代码的答案(带有for循环而不是while),其他帖子都有很好的例子。但当我说“切换”时,我指的似乎是多个执行选项。正如他们所展示的,一个简单的循环可以多次运行一个编码例程(分叉),但您似乎需要多个例程(第一个和第二个,依此类推)。切换(但不一定是关键字)部分用于决定运行哪个例程(第一个或第二个等等)。你不知道你想运行多少个,但是例程的/options/不可能是无限的,对吗?Jason,没错,它不总是相同的例程。。。这就是我被绊倒的地方,我想..凯尔,你在做什么来决定所有可用例程中的哪一个例程应该被选择?而且,这并不重要,但你想要一个长链的decentant,或者基本上是一个父母有很多孩子?我发布了一个答案(带有for-loop而不是while)其他帖子都有很好的例子。但当我说“切换”时,我指的似乎是多个执行选项。正如他们所展示的,一个简单的循环可以多次运行一个编码例程(分叉),但您似乎需要多个例程(第一个和第二个,依此类推)。切换(但不一定是关键字)部分用于决定运行哪个例程(第一个或第二个等等)。你不知道你想运行多少个,但是例程的/options/不可能是无限的,对吗?Jason,没错,它不总是相同的例程。。。这就是我被绊倒的地方,我想..凯尔,你在做什么来决定应该选择所有可用例程中的哪个例程?而且,这并不重要,但是你想要一个长链的decentants,或者基本上是一个有很多孩子的父母吗?所以每个孩子我都不一样?正确-第一个孩子会在i==0时分叉,第二个孩子会在i==1时分叉,等等。。。因此,如果您的命令位于一个“char*”数组中,您可以简单地将命令作为“command_array[i]”执行,因此每个子级的命令都不同?正确-第一个子级将在i==0时分叉,第二个子级将在i==1时分叉,以此类推。。。因此,如果您的命令位于“char*”数组中,您可以简单地将命令作为“command_array[i]”执行
break
?您通常不想在子代码块的末尾退出()
?你通常不想在子代码块的末尾退出()
吗?那么,你在做本科生的shell作业吗?鲍比沙夫托:我想,我只是为自己做的,我是音乐专业的;-)那么,你是在做本科的shell作业吗?鲍比·沙弗托:我想,只是为了我自己,我是音乐专业的;-)这是一个很好的答案。值得注意的是,在POSIX系统上,一个exec*函数失败后会设置errno。@BobbyShaftoe:是的,您可以报告错误,但exec系列函数返回这一事实就意味着它失败。这是一个很好的答案。值得注意的是,在POSIX系统上,一个exec*函数失败后会设置errno。@BobbyShaftoe:是的,您可以报告错误,但exec系列函数返回这一事实就意味着它失败了。