【问题标题】:fork() and waitpid() not waiting for childfork() 和 waitpid() 不等待孩子
【发布时间】:2016-03-19 03:03:25
【问题描述】:

我在让 waitpid 工作时遇到了一些麻烦,有人可以解释一下这段代码有什么问题吗?

#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
using namespace std;

int main() {
    string filename_memory;
    decltype(fork()) pid;

    if (!(pid = fork())) {
        cout << "in child" << endl;
        sleep(1);
    }

    else {
        int status_child;

        do {
            waitpid(pid, &status_child, WNOHANG);
            cout << "waiting for child to finish" << endl;
        } while (!WIFEXITED(status_child));

        cout << "child finished" << endl;
    }

    return 0;
}

【问题讨论】:

  • 您可能想检查waitpid 的返回值并仅在返回值等于pid 时才读取status_child,类似于if (ret == pid &amp;&amp; WIFEXITED(status_child)) break;

标签: c++ linux multiprocessing posix waitpid


【解决方案1】:

如果 wait() 或 waitpid() 因为子进程的状态而返回 可用时,这些函数应返回一个等于 报告状态的子进程的进程ID。

如果在选项中设置了 WNOHANG 来调用 waitpid(),它至少有 由 pid 指定的一个状态不可用的子进程, 并且状态对于 pid 指定的任何进程都不可用,0 是 回来。否则,应返回 (pid_t)-1,并将 errno 设置为 指出错误。

这意味着status_child 变量在waitpid 返回子进程的pid 之前没有任何意义。

您可以通过应用这些更改来解决此问题:

int ret;
do {
    ret = waitpid(pid, &status_child, WNOHANG);
    cout << "waiting for child to finish" << endl;
} while (ret != pid || !WIFEXITED(status_child));

cout << "child finished" << endl;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2012-08-29
    • 1970-01-01
    相关资源
    最近更新 更多