Порожденный ребенок выходит с состоянием = 127 - PullRequest
1 голос
/ 17 апреля 2009

Я использую posix_spawnp для выполнения различных процессов и проверяю статус (с помощью waitpid), чтобы убедиться, что дочерний элемент был создан правильно

    int iRet = posix_spawnp(&iPID, zPath, NULL, NULL, argv, environ);       

    if (iRet != 0)
    {
        return false;
    }

    int iState;
    waitpid(static_cast<pid_t>(iPID), &iState, WNOHANG);
    cout << "Wait: PID " << iPID << " | State " << iState << endl;

    if (WIFEXITED(iState)) {
        printf("Child exited with RC=%d\n",WEXITSTATUS(iState));
    }
    else if (WIFSIGNALED(iState)) {
        printf("Child exited via signal %d\n",WTERMSIG(iState));
    }
    else
    {
        printf("Child is NORMAL");
    }

Сначала это выполняется правильно, и я получаю следующее сообщение:

Подождите: PID 15911 | Состояние 0 Ребенок вышел с RC = 0

После выполнения одного и того же процесса несколько раз дочерний процесс начинает выходить со статусом 127.

Подождите: PID 15947 | Штат 32512 Детский выход с RC = 127

После того, как это произошло, я не мог заставить ребенка снова порождаться. Я заключил секцию кода, приведенную выше, в цикл for, но он не будет правильно создаваться. Если я перезапущу родительский процесс, он работает некоторое время, но через некоторое время снова возникает та же проблема.

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 17 апреля 2009

Проверьте эту ссылку .

Например:

EINVAL Неверное значение, указанное в file_actions или attrp.

Коды ошибок для подпрограмм posix_spawn и posix_spawnp зависят от следующих условий: Если эта ошибка возникает после успешного завершения вызывающего процесса из функции posix_spawn или posix_spawnp, дочерний процесс может завершиться со статусом выхода 127.

Похоже, что он может завершиться с 127 по целому ряду причин.

0 голосов
/ 17 апреля 2009

Проверьте код возврата от waitpid(), чтобы убедиться, что у него нет проблем.

Способ чтения кода предполагает, что вы порождаете только один дочерний процесс за раз (иначе не было бы необходимости вызывать waitpid() в цикле). Однако в этом случае я не ожидал бы использовать WNOHANG.

...