Порожденный дочерний элемент выходит с состоянием = 127.

StackOverflow https://stackoverflow.com/questions/759366

  •  09-09-2019
  •  | 
  •  

Вопрос

Я использую 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, но он не отображался должным образом.Если я перезапущу родительский процесс, какое-то время он будет работать, но через некоторое время снова возникнет та же проблема.

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

Это было полезно?

Решение

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

Например:

EINVAL Недопустимое значение, указанное в file_actions или attrp.

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

Похоже, что он может выйти со счетом 127 по целому ряду причин.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top