Я пытаюсь порождать дочерний процесс с posix_spawn()
.Я даю имя исполняемого файла (который существует), но posix_spawn()
создает процесс зомби (я ищу процесс в ps
, и он отображается как <defunct>
).Даже когда я указываю несуществующее имя исполняемого файла, создается процесс зомби.
Моя проблема заключается в том, что мне нужно знать, был ли процесс успешно создан или нет, но поскольку posix_spawn
возвращает 0 (успех)и идентификатор дочернего процесса действителен, у меня нет способа получить уведомление о том, что произошла ошибка.
Вот мой код (PS исполняемый файл "dummy" не существует):
#include <iostream>
#include <spawn.h>
extern char **environ;
int main()
{
const char *args[] = { "dummy", nullptr };
pid_t pid = 0;
posix_spawn(&pid, "dummy", nullptr, nullptr, const_cast<char **>(args), environ);
if (pid == 0)
{
// doesn't get here
}
else
// this gets executed instead, pid has some value
std::cout << pid << std::endl;
}
С получением статуса:
#include <iostream>
#include <spawn.h>
extern char **environ;
int main()
{
const char *args[] = { "dummy", nullptr };
int status = posix_spawn(nullptr, "dummy", nullptr, nullptr, const_cast<char **>(args), environ);
if (status != 0)
{
// doesn't get here
}
else
// this gets executed, status is 0
std::cout << status << std::endl;
}