Pclose() возвращает статус завершения канала, сдвинутый влево на восемь битов на всех платформах?

На Centos4 я обнаружил, что на странице man для popen() частично говорится:

DESCRIPTION
   The  pclose()  function shall close a stream that was opened by popen(), wait for the command to termi-
   nate, and return the termination status of the process that was running  the  command  language  inter-
   preter.   However, if a call caused the termination status to be unavailable to pclose(), then pclose()
   shall return -1 with errno set to [ECHILD] to report this situation.

Однако в моем приложении C++, когда я фактически выполняю код, я вижу, что статус завершения смещен влево на 8 бит. Возможно, это должно отличить -1 от статуса завершения канала от собственного состояния выхода pclose() -1?

Это портативное поведение? Почему страница руководства не упоминает об этом? Если платформы не переносимы, то какие платформы соответствуют этому поведению?

1 ответ

Просто чтобы добавить код к ответу стрелка выше, вы можете сделать что-то в строках этого:

#include <sys/wait.h>

//Get your exit code...
int status=pclose(pipe);

//...and ask how the process ended to clean up the exit code.
if(WIFEXITED(status)) {
    //If you need to do something when the pipe exited, this is the time.
    status=WEXITSTATUS(status);
}
else if(WIFSIGNALED(status)) {
    //If you need to add something if the pipe process was terminated, do it here.
    status=WTERMSIG(status);
}
else if(WIFSTOPPED(status)) {
    //If you need to act upon the process stopping, do it here.
    status=WSTOPSIG(status);
}

Кроме того, при необходимости добавьте элегантности.

Если вы думаете об этом, там есть "форк", поэтому вы можете захотеть "WIFEXITED" и "WEXITSTATUS".

Со страницы руководства:

Функция pclose() ожидает завершения связанного процесса и возвращает состояние завершения команды, возвращенное wait4(2).

Другие вопросы по тегам