Linux에서 종료 코드의 최소값과 최대값은 무엇입니까?

Linux에서 종료 코드의 최소값과 최대값은 무엇입니까?

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

  1. 바이너리 실행 파일(예: C 프로그램)에서 반환된 종료 코드입니다.
  2. bash 스크립트( 호출 시)에서 반환된 종료 코드입니다 exit.
  3. 함수에서 반환된 종료 코드입니다( 호출 시 return). 0와 사이 어딘가에 있는 것 같아요 255.

답변1

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

그러나 모든 시스템에서 상위 프로세스(또는 하위 수확기 또는 init상위 프로세스)가 이를 검색하기 위해 wait(),,, waitpid(), 시스템 호출을 사용하는 경우 해당 하위 8비트만 사용할 수 있습니다(값 0~255(2 8 - 1)) wait3(). ).wait4()

waitid()API(또는 SIGCHLD의 신호 처리기)를 사용할 때 대부분의 시스템(및POSIX는 이제 2016 버전의 표준에서 이를 더욱 명시적으로 요구합니다.(바라보다_exit()사양)) 전체 숫자를 사용할 수 있습니다( si_status반환된 구조의 필드에서). Linux에서는 그렇지 않습니다. Linux에서도 waitid()API를 사용하여 숫자를 8자리로 자르지만 이는 향후 변경될 수 있습니다.

$?일반적으로 말하면 많은 쉘이 표현에 128보다 높은 값을 사용하기 때문에 0(일반적으로 성공을 나타냄)과 125 사이의 값만 사용하는 것이 좋습니다.종료 상태종료된 프로세스의 신호 번호를 인코딩합니다(특별한 경우 126 및 127).

exit()셸과 동등한 것을 의미하기 위해 126~255를 사용할 수 있습니다 $?(예: script ret=$?; ...; exit "$ret"). 0 -> 255 이외의 값을 사용하는 것은 일반적으로 쓸모가 없습니다. 일반적으로 상위 항목이 waitid()잘리지 않는 시스템에서 API를 사용하고 32비트 범위의 값이 필요한 경우에만 이 작업을 수행합니다 . 예를 들면 exit(2048)기존 API를 사용하는 부모는 이를 성공으로 간주할 것입니다 wait*().

자세한 내용은 다음을 방문하십시오.

이 Q&A를 통해 대부분의 다른 질문에 답하고 명확하게 설명할 수 있기를 바랍니다.종료 상태. 더 추가하겠습니다:

프로세스가 종료되거나 시스템 호출 _exit()/ exit_group()호출이 발생하지 않는 한 프로세스를 종료할 수 없습니다. main()in 에서 돌아올 때 Clibc는 반환 값을 사용하여 해당 시스템 호출을 호출합니다.

대부분의 언어에는 이 시스템 호출을 래핑하는 함수가 있으며 exit(), 해당 값(있는 경우)은 일반적으로 그대로 시스템 호출에 전달됩니다. (이러한 작업은 일반적으로 C 함수에 의한 정리 exit(), stdio 버퍼 플러시, 후크 실행 등 더 많은 작업을 수행합니다 atexit().)

적어도 이 경우는 다음과 같습니다.

$ 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)                           = ?

exitPOSIX는 특수 내장 함수에 전달된 값이 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.


그러나 이는 다음 버전에서 변경될 수 있습니다. 개발은 ksh93이제 AT&T 외부 커뮤니티 노력의 일부입니다.POSIX가 어떻게든 이 동작을 장려했지만 다시 복원되고 있습니다.

답변2

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

이러한 규칙은 스크립트 및 기타 실행 파일은 물론 셸 기능에도 적용됩니다.

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

답변3

간단해 보이지만 맙소사.

C 언어(및 이후의 대부분의 다른 언어, 직접 또는 간접적)에서는 from의 반환이 반환 값과 동일한 인수를 사용하는 호출 main과 동일 해야 합니다. exit이는 정수(반환 유형은 매우 구체적임 int)이므로 원칙적으로 범위는 ~ INT_MIN입니다 INT_MAX.

하지만,POSIX 상태전달된 가장 낮은 8비트만 exit대기 중인 부모 프로세스에서 사용할 수 있습니다."상태&0xFF".
따라서 실제로 종료 코드는 가장 낮은 8비트만 설정된 (여전히 부호 있는) 정수입니다.

따라서 최소값은 -128 이고 최대값은 127 입니다 . 잠깐만, 그건 사실이 아니야. 0~255가 됩니다.

연민,물론 그렇게 간단할 수는 없다. 실제로 Linux(또는 오히려 bash)다르게 해봐. 반환 코드의 유효한 범위는 0~255(즉, 부호 없음)입니다.

혼란을 피하고 안전을 유지하려면 다음을 수행하는 것이 가장 좋습니다.생각하다반환 코드는 서명되지 않았으며 반환된 모든 항목은 wait서명되지 않은 코드로 변환됩니다. 이렇게 하면 쉘에 보이는 것과 일치하게 됩니다. 가장 높은 비트(가장 높은 비트 포함)가 지워지기 때문에 이는 "버그"도 아닙니다. 기술적으로는 서명되어 있지만 실제 값은 항상 부호가 없기 때문입니다(부호 비트가 설정되지 않기 때문). 또한 종료 코드를 다음 과
비교하는 일반적인 실수를 방지하는 데 도움이 됩니다 .-1이상한 이유로프로그램이 종료되어도 나타나지 않는 것 같습니다 -1(글쎄, 이유를 추측해보세요!).

마지막 요점과 관련하여 함수에서 반환하는 경우 이 함수가 이면 main위를 참조하세요. 그렇지 않으면 함수의 반환 유형이 무엇인지에 따라 달라지며 원칙적으로 다음과 같을 수 있습니다.아무것(포함하다 void).

답변4

  1. 바이너리 실행 파일(예: C 프로그램)에서 반환된 종료 코드입니다.
  2. bash 스크립트에서 반환된 종료 코드입니다(exit가 호출될 때).

모든 프로세스(바이너리 실행 파일, 쉘 스크립트 또는 기타 프로세스)의 종료 코드 범위는 0에서 255입니다. 더 큰 값은 다른 프로세스로 전달될 수 있지만 exit()상태의 하위 8비트만 사용됩니다 wait().

  1. 함수에서 반환된 종료 코드입니다(return이 호출될 때). 이 값은 0에서 255 사이인 것 같아요.

AC 함수는 거의 모든 유형을 반환하도록 선언할 수 있습니다. 반환 값의 제한은 전적으로 유형에 따라 결정됩니다. 예를 들어 반환된 함수의 경우 -128~127 , signed char반환된 함수의 경우 unsigned int0~42억입니다 . 여기에는 또는 a와 같은 숫자가 아닌 유형은 포함되지 않습니다.infdoublevoid *struct

관련 정보