Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ fork()和exec()两个子进程_C++_Process_Fork_Exec_Parent Child - Fatal编程技术网

C++ 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

我调用fork()两次以创建两个子进程。我希望子进程A执行exec()调用,子进程B也执行exec()调用。我在给定代码中遇到的问题是,在子进程A的第一个exec()之后,下一个fork()似乎不会出现,程序退出。我认为这与exec()如何覆盖父进程有关。我想要完成的是从fork()创建的每个子进程调用exec()

#包括
#包括
#包括
#包括
#包括
#包括
#包括
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.