Linux에서 종료 코드의 최소값과 최대 값은 얼마입니까? 값은 얼마입니까? 이진 실행 파일

Linux에서 다음 종료 코드의 최소값과 최대 값은 얼마입니까?

  1. 이진 실행 파일 (예 : C 프로그램)에서 종료 코드가 반환되었습니다.
  2. 종료 코드는 bash 스크립트에서 호출했습니다 (호출시 exit).
  3. 종료 코드가 함수에서 호출되었습니다 (호출시 return). 나는이 사이라고 생각 0하고 255.


답변

_exit()/ exit_group()시스템 호출에 전달 된 번호 (종종 종료 상태 의 모호함을 피하기 위해 종료 코드 라고도 함) . 종료 코드 또는 신호 번호의 인코딩 및 프로세스가 종료 또는 정상적으로 종료되었는지에 따라 추가 정보를 나타냄 ) 유형은 Linux와 같은 Unix 계열 시스템에서 일반적으로 -2147483648 (-2 31 )에서 2147483647 (2 31 -1)의 값을 갖는 32 비트 정수입니다 .int

부모 프로세스 (또는 자식 subreaper 또는 그러나, 모든 시스템에서, init부모가 사망하는 경우)를 사용하여 wait(), waitpid(), wait3(), wait4()시스템 호출 만의 하위 8 비트가 0 ~ 255 (2 사용할 수 (값이며,이를 검색하는 8 – 1)).

waitid()API (또는 SIGCHLD의 신호 처리기)를 사용할 때 대부분의 시스템에서 (그리고 POSIX가 2016 년 표준 ( _exit()사양 참조 ) 에서 더 명확하게 요구됨에 따라 ) si_status반환 된 구조 의 필드 에서 전체 숫자를 사용할 수 있습니다. ). Linux에서는 아직 그렇지 않지만 waitid()API 를 사용하여 숫자를 8 비트로 자르지 만 앞으로 변경 될 가능성이 있습니다.

일반적으로 많은 쉘 $?종료 상태 표시 에서 128 이상의 값을 사용 하여 종료 되는 프로세스의 신호 번호를 인코딩하고 특수한 경우 126 및 127을 사용하므로 값 0 (일반적으로 성공을 의미 함)을 125로만 사용 하려고합니다. 정황.

126 ~ 255를 사용 exit()하여 쉘과 동일한 것을 의미 $?할 수 있습니다 (스크립트와 같은 경우 ret=$?; ...; exit "$ret"). 0-> 255 이외의 값을 사용하는 것은 일반적으로 유용하지 않습니다. 일반적으로 부모가 waitid()잘리지 않는 시스템 에서 부모가 API를 사용 하고 32 비트 범위의 값이 필요한 경우에만 그렇게 합니다. 당신이 할 경우주의 exit(2048)예를 들어, 즉 기존의 사용 부모에 의해 성공으로 간주됩니다 wait*()API를.

자세한 정보 :

Q & A는 다른 대부분의 질문에 희망적으로 답변하고 종료 상태의 의미를 명확히해야 합니다 . 몇 가지 더 추가하겠습니다 :

프로세스가 종료되거나 _exit()/ exit_group()시스템 호출을 호출하지 않으면 프로세스를 종료 할 수 없습니다 . 당신은에서 복귀 할 때 main()C반환 값으로, libc의 통화가 시스템 호출.

대부분의 언어에는 exit()시스템 호출을 래핑 하는 기능과 일반적으로 시스템 호출에 전달되는 값이있는 경우 사용하는 값이 있습니다. (일반적으로 exit()stdio 버퍼를 플러시하고 atexit()후크를 실행하는 C의 기능으로 수행되는 정리와 같은 더 많은 작업을 수행합니다 .)

적어도 그런 경우입니다.

$ strace -e exit_group awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group mawk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ strace -e exit_group busybox awk 'BEGIN{exit(1234)}'
exit_group(1234)                        = ?
$ echo | strace -e exit_group sed 'Q1234'
exit_group(1234)                        = ?
$ strace -e exit_group perl -e 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group python -c 'exit(1234)'
exit_group(1234)                        = ?
$ strace -e exit_group expect -c 'exit 1234'
exit_group(1234)                        = ?
$ strace -e exit_group php -r 'exit(1234);'
exit_group(1234)                        = ?
$ strace -e exit_group zsh -c 'exit 1234'
exit_group(1234)

0-255 이외의 값을 사용하면 불만을 나타내는 것을 가끔 볼 수 있습니다.

$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1)                           = ?

음수 값을 사용하면 일부 쉘이 불평합니다.

$ strace -e exit_group dash -c 'exit -1234'
dash: 1: exit: Illegal number: -1234
exit_group(2)                           = ?
$ strace -e exit_group yash -c 'exit -- -1234'
exit: `-1234' is not a valid integer
exit_group(2)                           = ?

POSIX는 exit특수 내장으로 전달 된 값 이 0-> 255를 벗어나 면 동작을 정의되지 않은 상태로 둡니다 .

다음과 같은 경우 일부 셸에 예기치 않은 동작이 표시됩니다.

  • bash(그리고 기반이 mksh아닌 pdksh) 값을 8 비트로 자릅니다.

    $ strace -e exit_group bash -c 'exit 1234'
    exit_group(210)                         = ?
    

    따라서 해당 쉘에서 0-255 이외의 값으로 종료하려면 다음과 같이해야합니다.

    exec zsh -c 'exit -- -12345'
    exec perl -e 'exit(-12345)'
    

    즉 , 원하는 값으로 시스템 호출을 호출 할 수 있는 동일한 프로세스에서 다른 명령을 실행 합니다.

  • 다른 Q & A에서 언급했듯이 ksh93257에서 256 + max_signal_number의 종료 값에 대해 가장 이상한 행동을합니다 exit_group().

    $ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    zsh: suspended (signal)  ksh -c 'exit "$((256 + $(kill -l STOP)))"'
    

    그렇지 않으면 bash/ 와 같은 숫자를 자릅니다 mksh.


¹ 다음 버전에서는 변경 될 수 있습니다. ksh93AT & T 이외의 지역 사회 노력으로 발전 이 이어 졌으므로 POSIX의 격려를 받아도 그 행동은 되돌려지고 있습니다.


답변

최소값은 0입니다. 성공 가치로 간주됩니다. 다른 모든 것은 실패입니다. 최대 값은 255이라고도합니다 -1.

이 규칙은 스크립트 및 기타 실행 파일과 쉘 기능 모두에 적용됩니다.

더 큰 값은 모듈로 256이됩니다.


답변

이건 너무 단순 해 보이지만

C 언어 (및 대부분의 다른 언어를 직간접 적 으로 따라 가기)는 반환 값과 동일한 인수를 사용하여 main호출 exit하는 것과 동일하게 반환해야합니다. 이 정수 (리턴 타입은 매우 명확입니다 int), 그래서 원칙적으로 범위가 될 것이다 INT_MININT_MAX.

그러나 POSIX는 전달 된 최하위 8 비트 만 exit문자 그대로 “status & 0xFF”인 것처럼 대기 부모 프로세스에서 사용할 수 있어야한다고 명시하고 있습니다 .
따라서 실제로 종료 코드는 가장 낮은 8 비트 만 설정되는 (서명 된) 정수입니다.

따라서 최소값은 -128이고 최대 값은 127 입니다. 잠깐만 요, 사실이 아닙니다. 0에서 255까지입니다.

그러나 아아, 물론 그렇게 간단 할 수는 없습니다 . 실제로 Linux (또는 bash) 는 다르게 작동합니다 . 리턴 코드의 유효 범위는 0-255입니다 (즉, 부호 없음).

혼동을 피하는 측면에서 안전을 유지하려면 리턴 코드가 서명되지 않았다고 가정 하고 다시 서명하지 않은 것을 캐스트하는 것이 좋습니다 wait. 그렇게하면 쉘에서 보는 것과 일치합니다. 최상위 비트 (가장 중요한 비트 포함)가 지워 지므로 기술적으로 부호가 있더라도 실제 값은 항상 부호가 없으므로 (부호 비트가 설정되지 않기 때문에) “잘못”되지 않습니다.
또한 종료 코드를와 비교하는 일반적인 오류를 피하는 데 도움이됩니다 -1. 이는 이상한 이유로 프로그램이 종료 될 때조차 나타나지 않는 것 같습니다 -1(왜, 왜!).

함수에서 돌아 오는 마지막 지점에 대해이 함수가 인 경우 main위를 참조하십시오. 그렇지 않으면 함수의 반환 유형이 무엇인지에 따라 원칙적으로 무엇이든 (를 포함하여 void) 될 수 있습니다 .


답변

  1. 이진 실행 파일 (예 : C 프로그램)에서 종료 코드가 반환되었습니다.
  2. 종료 코드는 bash 스크립트에서 리턴되었습니다 (종료를 호출 할 때).

이진 실행 파일이든 셸 스크립트이든 다른 프로세스이든 관계없이 모든 프로세스의 종료 코드 범위는 0에서 255까지입니다. 더 큰 값을 전달할 수는 exit()있지만 하위 8 비트 만 사용할 수 있습니다. 를 통해 다른 프로세스 wait().

  1. 종료 코드는 함수에서 리턴되었습니다 (return 호출시). 나는 이것이 0과 255 사이라고 생각합니다.

AC 함수는 거의 모든 유형을 반환하는 것으로 선언 될 수 있습니다. 반환 값의 한계는 그 타입에 의해 전적으로 결정된다 : 예를 들어, -128 기능에 대한 (127)로 복귀 signed char하거나, 0 함수가 리턴하는 억 4.2 unsigned int, 또는 부동 소수점 숫자까지 포함 inf반환하는 함수 double. 처럼 그리고 즉, 숫자가 아닌 유형을 계산하지 않는 void *struct