Получить код выхода из не дочернего процесса в Linux

0

Добрый день! У меня есть процесс, который был создан через функцию 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;
}
  • 1
    Функция posix_spawn возвращает идентификатор процесса так же, как и fork , что означает, что вы можете использовать обычное семейство функций wait . Фактически, созданный процесс является дочерним по отношению к вашему процессу, как и при создании процесса с помощью fork .
  • 0
    @JoachimPileborg: я думаю, что это должен быть ответ. Кажется, вся основа этого вопроса заключается в том, что ОП не понимает, что означает «дочерний процесс».
Показать ещё 3 комментария
Теги:
process

2 ответа

0

Проблема в два раза: сначала ваша проверка, если процесс все еще жив или нет, неверен. На странице waitpid странице возврата о возвращаемом значении:

если указан WNOHANG и один или несколько дочерних (ren), указанных pid, существуют, но еще не изменили состояние, тогда возвращается 0.

Поскольку вы проверяете значение больше нуля, это означает, что вы возвращаете -1 когда процесс -1.

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

0

Удалите второй вызов waitpid, первый получил статус (вы можете ждать процесс только один раз).

  • 0
    Итак, если я хочу проверить, если процесс все еще жив, я должен проверить это функцией kill? Как это описано в этом вопросе? stackoverflow.com/questions/1157700/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню