fork()和exec()两个子进程

时间:2017-03-09 02:43:15

标签: c++ process fork exec parent-child

我两次调用fork()来创建两个子进程。我希望子进程A执行exec()调用,子进程B也执行exec()调用。我对给定代码的问题是,在子进程A的第一个exec()之后,似乎没有发生下一个fork()并且程序退出。我认为这与exec()覆盖父进程的方式有关。我想要完成的是从fork()创建的每个子进程调用exec()。

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>

int main() {

pid_t cpid_a, cpid_b;

cpid_a = fork();
if(cpid_a < 0) {
    std::cout << "Fork failed." << '\n';
    return 1;
}
else if(cpid_a == 0) { // code for child process A
    execlp("/bin/ls", "ls", NULL);

    cpid_b = fork();
    if(cpid_b < 0) {
        std::cout << "Fork failed." << '\n';
        return 1;
    }
    else if(cpid_b == 0) { // code for child process B
        execlp("/bin/ls", "ls", NULL);
    }
}
else { // code for parent process
    while(wait(NULL) != -1);
}
return 0;
}

1 个答案:

答案 0 :(得分:2)

else if(cpid_a == 0) { // code for child process A
    execlp("/bin/ls", "ls", NULL);

如果此调用成功,则将执行以下语句,并且不会执行任何后续语句。这就是exec()的工作原理。紧随其后的fork()永远不会发生。这就是exec()的工作原理。如果exec()成功,它永远不会返回。替换过程在其位置执行。

您甚至在上面添加了100%正确的评论:&#34;子流程A&#34;的代码。 if()语句中的所有内容都是&#34;子进程A&#34;的代码,并在fork()返回0时执行。

您还正确地声明您希望父进程分叉第二个进程。好吧,你需要 那个 代码显然是由父进程执行的,而不是子进程:

else if(cpid_a == 0) { // code for child process A
    execlp("/bin/ls", "ls", NULL);
    exit(1);
} else {
    cpid_b = fork();

  // The rest of the code.

现在,父流程继续进行,fork()再次进行,继续执行其余计划。

P.S。 exit()只是一个很好的衡量标准。 exec()返回的唯一时间是exec()无法执行给定进程的时间。在/bin/ls的情况下极不可能;如果它遗失了你需要担心更大的问题。尽管如此,这是技术上正确的事情,因为在那一点继续执行将导致完全混乱。同样,如果缺少/bin/ls,这将是问题中最少的问题,但如果系统内存不足而无法执行此问题,也会发生这种情况。 ;在这种情况下,不需要为火灾添加燃料;但无论如何都要让过程死掉。