Код выхода, ответное эхо отличается от кода выхода программы. Почему?

Я написал программу, которая возвращает код ошибки с помощью процессов. Результат работы программы, если при входе в нее указать команду false, равен 255. Однако команда false; эхо $? возвращает 1 Почему это происходит? Солярис, Юникс

Я нашел файл false.c в исходном коде, он возвращает 255 (не уверен, что это правильная команда) https://github.com/illumos/illumos-gate/blob/master/usr/src/cmd/false/false.c

#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <wait.h>

main(int argc, char *argv[])
{
        int status;
        pid_t pid = fork();
        if (pid == -1){
                perror("fork error");
                exit(-1);
        }
        if (pid == 0) {
                execvp(argv[1], &argv[1]);
                perror(argv[1]);
                exit(-5);
        }
        if( wait(&status) == -1){
                perror("wait");
                exit(-1);
        }
        if(WIFEXITED(status))
                printf("exit status: %d\n",WEXITSTATUS(status));

        exit(0);
}

person Sombrero    schedule 26.05.2019    source источник
comment
Какие false вы выполняете? bash имеет встроенную функцию false. Рассмотрим команды bash command и builtin.   -  person glenn jackman    schedule 26.05.2019
comment
Почему бы вам не показать соответствующую часть вашей программы вместо исходного кода сторонней программы, в которой вы даже не уверены, что она принадлежит двоичному файлу, который вы вызываете. Кроме того, попытайтесь выяснить, какое значение false вы вызываете (используйте type false и ваш менеджер пакетов).   -  person Michael Jaros    schedule 26.05.2019
comment
Если вы запустите false в bash, он будет использовать встроенный bash. Если вы запустите false через exec*p, тогда будет запущен двоичный файл системы.   -  person that other guy    schedule 26.05.2019


Ответы (1)


Коды выхода UNIX (Linux, Solaris, BSD и т. д.) могут быть только от 0 до 255, где 0 — хорошо, а ненулевое значение — ошибка. Коды выхода не имеют знака, поэтому -1 может быть преобразовано в другое (не нулевое) значение, как и значения больше 255.

person Dan Anderson    schedule 28.05.2019
comment
Коды выхода UNIX (Linux, Solaris, BSD и т. д.) могут быть только от 0 до 255 Это уже не так. Согласно POSIX 7: значение выхода в si_status должно быть равно полному выходному значению (то есть значению, переданному в _exit(), _Exit() или exit() или возвращенному из main()); он не должен ограничиваться младшими значащими восемью битами значения. Насколько мне известно, Linux по-прежнему не соответствует этой части стандарта POSIX. Но WEXITSTATUS по-прежнему возвращает только младшие 8 бит. - person Andrew Henle; 29.05.2019