微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 wait();

如何解决如何使用 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 举报,一经查实,本站将立刻删除。