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).