我在让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/