C++ fork()和exec()两个子进程
我调用fork()两次以创建两个子进程。我希望子进程A执行exec()调用,子进程B也执行exec()调用。我在给定代码中遇到的问题是,在子进程A的第一个exec()之后,下一个fork()似乎不会出现,程序退出。我认为这与exec()如何覆盖父进程有关。我想要完成的是从fork()创建的每个子进程调用exec()C++ fork()和exec()两个子进程,c++,process,fork,exec,parent-child,C++,Process,Fork,Exec,Parent Child,我调用fork()两次以创建两个子进程。我希望子进程A执行exec()调用,子进程B也执行exec()调用。我在给定代码中遇到的问题是,在子进程A的第一个exec()之后,下一个fork()似乎不会出现,程序退出。我认为这与exec()如何覆盖父进程有关。我想要完成的是从fork()创建的每个子进程调用exec() #包括 #包括 #包括 #包括 #包括 #包括 #包括 int main(){ pid_t cpid_a,cpid_b; cpid_a=fork(); 如果(cpid_a
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(){
pid_t cpid_a,cpid_b;
cpid_a=fork();
如果(cpid_a<0){
标准::cout
如果调用成功,下面的语句将永远不会执行。这就是exec()
的工作方式。紧跟其后的fork()
永远不会发生。这就是exec()
的工作方式。如果exec()
成功,它将永远不会返回。替换过程将在其位置执行
您甚至在上面添加了100%正确的注释:“子进程A的代码”。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()
继续执行计划的其余部分
另外,
exit()
只是一个很好的衡量标准。只有当exec()返回时,exec()才会返回
无法执行给定的进程。在/bin/ls
的情况下,这种情况极不可能发生;如果缺少它,您将有更大的问题要担心。不过,这在技术上是正确的,因为在该点继续执行将导致完全混乱。同样,如果/bin/ls
缺少,这将是最不可能的但是,如果系统内存不足,因此无法执行,也可能发生这种情况;在这种情况下,不需要添加燃料;而是让进程死掉。如果execlp
返回,那只是因为它失败了。在调用execl后,不应该有任何代码执行任何操作g除了handle a error.IOW,您的孩子应该调用execl,而家长应该第二次调用fork
。
else if(cpid_a == 0) { // code for child process A
execlp("/bin/ls", "ls", NULL);
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.