fork () и waitpid () не ожидают ребенка

У меня возникли некоторые проблемы с получением 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;
}

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;
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]