我在让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;
}

最佳答案

如果wait()或waitpid()返回,因为子进程的状态
如果可用,这些函数将返回一个等于
报告状态的子进程的进程ID。
如果waitpid()是用选项中设置的wnohang调用的,那么它至少有
由PID指定的一个子进程,其状态不可用,
且状态不可用于由PID指定的任何进程,0是
返回。否则,(pid_t)-1应返回,errno设置为
指出错误。
这意味着在status_child返回子对象的pid之前,waitpid变量没有意义。
您可以通过应用这些更改来解决此问题:

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;

关于c++ - fork()和waitpid()不等待子级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34253372/

10-12 07:38