gpt4 book ai didi

c++ - fork() 和 exec() 两个子进程

转载 作者:行者123 更新时间:2023-11-30 05:16:24 25 4
gpt4 key购买 nike

我两次调用 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;
}

最佳答案

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

如果此调用成功,将永远不会执行以下语句以及后面的任何内容。这就是 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 丢失那将是最不重要的问题,但是如果系统内存不足并且由于该原因无法执行它,也会发生这种情况;在这种情况下,就没有必要往火上添油了;而是让进程死掉。

关于c++ - fork() 和 exec() 两个子进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685719/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com