我两次调用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;
}
答案 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
,这将是问题中最少的问题,但如果系统内存不足而无法执行此问题,也会发生这种情况。 ;在这种情况下,不需要为火灾添加燃料;但无论如何都要让过程死掉。