在fork()中可以调用exec()的次数

时间:2016-07-30 17:53:49

标签: posix

问题在于我正在调用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;
}

1 个答案:

答案 0 :(得分:0)

如你所说,exec永远不会返回(除非失败),因此创建第二个子节点的代码永远不会执行。

您可以让家长致电fork若干次,并让每个孩子致电exec,然后让家长致电exec

或者,父母可以调用fork,然后调用exec,孩子也可以这样做,因此它会创建另一个孩子,依此类推。当您创建了足够的流程后,最后一个孩子会调用exec而不会调用fork来停止链接。