Есть ли в Linux какие-либо стандартные коды статуса выхода?

Попытайтесь использовать

this.Master.FindControl("ContentId").FindControl("controlId")

вместо этого.

300
задан codeforester 16 May 2018 в 02:39
поделиться

8 ответов

8 бит кода возврата и 8 бит номера сигнала уничтожения смешиваются в одно значение при возврате из wait (2) & co. .

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

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

Как вы определяете статус выхода? Традиционно оболочка хранит только 8-битный код возврата, но устанавливает высокий бит, если процесс был аварийно завершен.

$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
Segmentation fault
139
$ expr 139 - 128
11

Если вы видите что-то другое, то программа, вероятно, имеет SIGSEGV ] обработчик сигнала, который затем обычно вызывает exit , так что на самом деле сигнал не убивает его. (Программы могут выбрать обработку любых сигналов, кроме SIGKILL и SIGSTOP .)

84
ответ дан 23 November 2019 в 01:27
поделиться

'1' >>> Catchall для общих ошибок

'2' >>> Неправильное использование встроенных команд оболочки (согласно документации Bash)

'126 ' >>> Вызванная команда не может выполнить

' 127 ' >>> "команда не найдена"

' 128 ' >>> Недействительный аргумент для выхода

' 128+ n ' >>> Сигнал фатальной ошибки "n"

' 130 ' >>> Скрипт завершается Control-C

' 255 ' >>> Статус выхода вне допустимого диапазона

Это для bash. Однако для других приложений существуют другие коды выхода.

69
ответ дан 23 November 2019 в 01:27
поделиться

Стандартных кодов выхода не существует, кроме 0, означающего успех. Ненулевое значение тоже не обязательно означает сбой.

stdlib.h действительно определяет EXIT_FAILURE как 1 и EXIT_SUCCESS как 0, но это все.

11 на segfault интересен, поскольку 11 - это номер сигнала, который ядро ​​использует для остановки процесса в случае segfault. Вероятно, существует какой-то механизм, либо в ядре, либо в оболочке, который переводит это в код выхода.

24
ответ дан 23 November 2019 в 01:27
поделиться

sysexits.h содержит список стандартных кодов выхода. Кажется, что он датируется как минимум 1993 годом, и некоторые крупные проекты, такие как Postfix, используют его, так что я думаю, что это правильный путь.

Из справочной страницы OpenBSD:

Согласно стилю (9), это нехорошо практика вызывать exit (3) с произвольным значения trary, указывающие на состояние отказа при завершении программы. В- вместо этого следует использовать предопределенные коды выхода из sysexits, поэтому вызывающий процесс может получить приблизительную оценку класса отказа не просматривая исходный код.
20
ответ дан 23 November 2019 в 01:27
поделиться

Programs return a 16 bit exit code. If the program was killed with a signal then the high order byte contains the signal used, otherwise the low order byte is the exit status returned by the programmer.

How that exit code is assigned to the status variable $? is then up to the shell. Bash keeps the lower 7 bits of the status and then uses 128 + (signal nr) for indicating a signal.

The only "standard" convention for programs is 0 for success, non-zero for error. Another convention used is to return errno on error.

5
ответ дан 23 November 2019 в 01:27
поделиться

Стандартные коды выхода Unix определены в sysexits.h, как упоминалось на другом плакате. Те же коды выхода используются переносными библиотеками, такими как Poco - вот их список:

http://pocoproject.org/docs/Poco.Util.Application.html#16218

Сигнал 11 - это Сигнал SIGSEGV (нарушение сегмента), который отличается от кода возврата. Этот сигнал генерируется ядром в ответ на неправильный доступ к странице, что приводит к завершению программы. Список сигналов можно найти на странице руководства по сигналам (запустите "man signal").

3
ответ дан 23 November 2019 в 01:27
поделиться

Когда Linux возвращает 0, это означает успех. Все остальное означает сбой, каждая программа имеет свои собственные коды выхода, поэтому было бы довольно долго перечислять их все ...!

Что касается кода ошибки 11, это действительно номер ошибки сегментации, в основном это означает, что программа обратилась к ячейка памяти, которая не была назначена.

1
ответ дан 23 November 2019 в 01:27
поделиться

Часть 1: Расширенные сценарии Bash Руководство

Как всегда, Advanced Bash Scripting Guide содержит полезную информацию : (Это было связано в другом ответе, но с неканоническим URL.)

1: Catchall для общих ошибок
2: Неправильное использование встроенных команд оболочки (согласно документации Bash)
126: Вызванная команда не может выполнить
127: «команда не найдена»
128: Неверный аргумент для выхода
128 + n: Сигнал фатальной ошибки «n»
255: Статус выхода вне допустимого диапазона (exit принимает только целочисленные аргументы в диапазоне 0–255)

Часть 2: sysexits.h

Ссылки ABSG sysexits.h .

В Linux:

$ find /usr -name sysexits.h
/usr/include/sysexits.h
$ cat /usr/include/sysexits.h

/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  All rights reserved.

 (A whole bunch of text left out.)

#define EX_OK           0       /* successful termination */
#define EX__BASE        64      /* base value for error messages */
#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */

#define EX__MAX 78      /* maximum listed value */
327
ответ дан 23 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: