问题在于我正在调用fork(),并且我正在调用exec两次,一次在父级中,一次在子级中。我刚刚提出了通过创建更多子项多次调用exec的新想法..但是,只有第一个父和子调用exec,其余的只是被忽略 现在我明白,一旦一名执行官被召唤你就不会回来,但我有这种运行多个高管的好奇心,有什么方法可以做到这一点吗? 顺便说一句,我确实尝试在第一个父母之外创建一个孩子和一个父母,但输出仍然是相同的
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/wait.h>
#include <sys/types.h>
int main(int argc,char* argv[])
{
pid_t parent=fork();
if (parent>0)
{
printf("This is the parent \n");
execl("/home/desertstorm/OS/Final/Exec_Calls/exec1.out","./exec1.out",argv[1],argv[2],argv[3],NULL);
wait(NULL);
if (parent<0)
printf("Fork failed\n");
pid_t child=fork();
if (child>0)
{
printf("This is the second parent\n");
execl("/home/desertstorm/OS/Final/Exec_Calls/exec3.out","./exec3.out",argv[1],argv[2],argv[3],NULL);
wait(NULL);
pid_t child1=fork();
if (child1>0)
{
printf("This is the third parent\n");
execl("/home/desertstorm/OS/Final/Exec_Calls/exec1.out","./exec1.out",argv[1],argv[2],argv[3],NULL);
wait(NULL);
}
if (child1==0)
{
printf("This is the third child\n");
execl("/home/desertstorm/OS/Final/Exec_Calls/exec4.out","./exec4.out",argv[4],argv[5],argv[6],NULL);
}
if (parent==0)
{
printf("This is the child\n");
execl("/home/desertstorm/OS/Final/Exec_Calls/exec2.out","./exec2.out",argv[4],argv[5],argv[6],NULL);
}
}
if (child==0)
{
printf("This is the second child\n");
execl("/home/desertstorm/OS/Final/Exec_Calls/exec4.out","./exec4.out",argv[4],argv[5],argv[6],NULL);
}
}
return 0;
}
答案 0 :(得分:0)
如你所说,exec
永远不会返回(除非失败),因此创建第二个子节点的代码永远不会执行。
您可以让家长致电fork
若干次,并让每个孩子致电exec
,然后让家长致电exec
。
或者,父母可以调用fork
,然后调用exec
,孩子也可以这样做,因此它会创建另一个孩子,依此类推。当您创建了足够的流程后,最后一个孩子会调用exec
而不会调用fork
来停止链接。