У меня возникли некоторые проблемы с получением 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
переменная не имеет смысла до 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;
Других решений пока нет …