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;
}
答
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
丢失,这将成为问题中最小的问题,但是如果系统内存不足并且由于这个原因无法执行它,也会发生这种情况;在这种情况下,不需要向火灾添加燃料;反而让这个过程死去。
如果'execlp'返回,那只是因为它失败了。除非处理错误,否则在调用execl之后,您绝对不应该有任何代码。 –
IOW,您的孩子应该调用execl,并且父母应该再次调用fork。 –