_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에서 언급했듯이 ksh93
257에서 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의 격려를 받아도 그 행동은 되돌려지고 있습니다.
return
입니다, 물론, 쉘 내장합니다.