Добрый день! У меня есть процесс, который был создан через функцию posix_spawn
. Как я могу получить его код выхода?
Я знаю о функции waitpid()
но возвращает статус для дочернего процесса. Кроме того, если процесс все еще живой, и я буду называть waitpid()
тогда я получу правильную информацию о том, что этот процесс еще не закрыт.
Вот мой текущий код:
int GetExitCode()
{
int status;
int rtn = waitpid(pid, &status, WNOHANG);
if (rtn > 0) // still live
{
return -1;
}
rtn = waitpid(pid, &status, WUNTRACED);
if (rtn != -1 || errno != ECHILD)
{
// Here I got rtn = -1 and errno #10
}
if (WIFEXITED(status))
{
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
}
Но как я могу проверить статус выхода для не-дочернего процесса? Благодарю!
Обновлено. Мой новый код:
int GetExitCode()
{
int status = 0;
int rtn = kill(pid, 0);
if (rtn == -1 && errno == ESRCH)
{
return 0;
}
rtn = waitpid(pid, &status, WNOHANG | WUNTRACED | WCONTINUED);
if (rtn == 0) // still live
{
return 0;
}
std::cout << "Probably success. Errno: " << errno << ". StrError: " << strerror(errno) << std::endl;
if (WIFEXITED(status))
{
return 1;
}
return 0;
}
Проблема в два раза: сначала ваша проверка, если процесс все еще жив или нет, неверен. На странице waitpid
странице возврата о возвращаемом значении:
если указан WNOHANG и один или несколько дочерних (ren), указанных pid, существуют, но еще не изменили состояние, тогда возвращается 0.
Поскольку вы проверяете значение больше нуля, это означает, что вы возвращаете -1
когда процесс -1
.
Вторая проблема заключается в том, что вы дважды вызываете waitpid
. Если процесс завершился, то вы уже "пожинаете" его первым вызовом, поэтому второй вызов дает вам ошибку, так как дочерний процесс больше не существует.
Удалите второй вызов waitpid, первый получил статус (вы можете ждать процесс только один раз).
posix_spawn
возвращает идентификатор процесса так же, как иfork
, что означает, что вы можете использовать обычное семейство функцийwait
. Фактически, созданный процесс является дочерним по отношению к вашему процессу, как и при создании процесса с помощьюfork
.