在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系列函数返回这一事实就意味着它失败了。