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

问题描述:

我正在调用fork()两次来创建两个子进程。我想要子进程A执行一个exec()调用和子进程B也执行exec()调用。我对给定代码的问题是,在子进程A的第一个exec()之后,下一个fork()似乎不会出现,并且程序退出。我认为这与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; 
} 
+0

如果'execlp'返回,那只是因为它失败了。除非处理错误,否则在调用execl之后,您绝对不应该有任何代码。 –

+0

IOW,您的孩子应该调用execl,并且父母应该再次调用fork。 –

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

如果调用成功,下面的语句,并没有跟随永远不会被执行。这就是exec()的工作原理。紧随其后的fork()从未发生。这就是exec()的工作原理。如果exec()成功,它永远不会返回。替换过程在其位置执行。

你甚至添加了100%正确的评论,上面:“子进程代码”。 if()语句中的所有内容都是“子进程A的代码”,并在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丢失,这将成为问题中最小的问题,但是如果系统内存不足并且由于这个原因无法执行它,也会发生这种情况;在这种情况下,不需要向火灾添加燃料;反而让这个过程死去。