如何解决如何使用 wait();
我正在尝试创建一个程序,其中父进程进行一些计算并将其发送到子进程,子进程派生另一个进程并进行更多计算并将其发送到 child2 进程以进行进一步处理。 我似乎无法弄清楚如何做到这一点。 我的输出都搞砸了,有时孩子 2 在孩子 1 之前运行。有时孩子 1 最后完成。 我希望其他进程等待它们。
我认为代码应该是这样的
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
int main(int argc,char *argv[])
{
int fd[6];
pipe(fd);
pipe(fd + 2);
pipe(fd + 4);
pid_t id = fork();
if (id == -1)
return 1;
if (id == 0)
{
wait(NULL);
pid_t id2 = fork();
if (id2 == -1)
return 2;
if (id2 == 0)
{
wait(NULL);
pid_t id3 = fork();
if (id3 == -1)
return 2;
if (id3 == 0)
{
wait(NULL);
cout << "Child 3" << endl;
// Read data from pipe and display
}
else
{
cout << "Child 2" << endl;
// Read Data from pipe and display
// Some computation
for (int i = 0; i < 10000; i++)
{
}
// Send Data to Child 3 through pipe
wait(NULL);
}
}
else
{
cout << "Child 1" << endl;
// Read Data from pipe
// Some computation
for (int i = 0; i < 100000000; i++)
{
}
// Send Data to Child 2 through pipe
wait(NULL);
}
}
else
{
cout << "Parent" << endl;
// Some computation
for (int i = 0; i < 2000; i++)
{
}
// Send Data to Child 1 through pipe
wait(NULL);
}
}
解决方法
只要同一进程组中的任何子进程终止(因此包括任何孙进程),wait调用就会返回。
如果您想等待特定进程,请改用 waitpid。您还应该检查退出代码和状态。
最后,你应该等待子进程退出通过管道与它交互,而不是之前,你不应该在启动子进程之前等待。
#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;
void die(const char* msg) {
perror(msg);
exit(1);
}
int main(int argc,char* argv[]) {
int fd[6];
pipe(fd);
pipe(fd + 2);
pipe(fd + 4);
pid_t id = fork();
if (id == -1)
die("fork");
if (id == 0) {
pid_t id2 = fork();
if (id2 == -1)
die("fork 2");
if (id2 == 0) {
pid_t id3 = fork();
if (id3 == -1)
die("fork 3");
if (id3 == 0) {
cout << "Child 3" << endl;
// Read data from pipe and display
// Done. Nothing to wait for - just exit child 3
cout << "Child 3 exiting" << endl;
} else {
cout << "Child 2" << endl;
// Read Data from pipe and Display
// Some Computation
// Send Data to Child 3 through pipe
// Wait for child 3 to finish before exiting child 2
if (waitpid(id3,NULL,0) < 0)
die("waitpid 3");
cout << "Child 2 exiting" << endl;
}
} else {
cout << "Child 1" << endl;
// Read Data from pipe
// Some Computation
// Send Data to Child 2 through pipe
// Wait for child 2 to finish before exiting child 1
if (waitpid(id2,0) < 0)
die("waitpid 2");
cout << "Child 1 exiting" << endl;
}
} else {
cout << "Parent" << endl;
// Some Computation
// Send Data to Child 1 through pipe
// Wait for child 1 to finish before exiting parent
if (waitpid(id,0) < 0)
die("waitpid 1");
cout << "Parent exiting" << endl;
}
}
打印:
Parent
Child 1
Child 3
Child 2
Child 3 exiting
Child 2 exiting
Child 1 exiting
Parent exiting
请注意,Child 1
/2
/3
以随机顺序打印 - 这是因为所有子进程并行运行,这是完全正常的(我们希望进程并行运行,这是分叉的全部意义)。读取/写入管道时将强制执行排序 - 从管道读取的子项将等到数据到达。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。