posix_spawn создает процесс зомби и возвращает успех - PullRequest
0 голосов
/ 05 февраля 2019

Я пытаюсь порождать дочерний процесс с 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;
}

1 Ответ

0 голосов
/ 05 февраля 2019

Дочерний процесс, являющийся зомби, означает, что он завершен / умер, и вам нужно пожинать его статус завершения с wait/waitpid.

#include <sys/wait.h>
//...
int wstatus; 
waitpid(pid,&wstatus,0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...