O número passado para a chamada _exit()
/ exit_group()
system (às vezes chamado de código de saída para evitar a ambiguidade com o status de saída), que também se refere a uma codificação do código de saída ou número do sinal e informações adicionais, dependendo se o processo foi encerrado ou encerrado normalmente ) é do tipo int
, portanto, em sistemas do tipo Unix, como o Linux, geralmente um número inteiro de 32 bits com valores de -2147483648 (-2 31 ) a 2147483647 (2 31 -1).
No entanto, em todos os sistemas, quando o processo pai (ou a subreaper criança ou init
se o pai morreu) usa os wait()
, waitpid()
, wait3()
, wait4()
chamadas de sistema para recuperá-lo, apenas os 8 bits inferiores de que são disponíveis (valores de 0 a 255 (2 8 - 1)).
Ao usar a waitid()
API (ou um manipulador de sinal no SIGCHLD), na maioria dos sistemas (e como o POSIX agora exige mais claramente na edição de 2016 do padrão (consulte a _exit()
especificação )), o número completo está disponível (no si_status
campo da estrutura retornada ) Esse ainda não é o caso do Linux, embora também trunque o número de 8 bits com a waitid()
API, mas isso provavelmente mudará no futuro.
Geralmente, você deseja usar apenas os valores 0 (geralmente significando sucesso) a 125 apenas, pois muitos shells usam valores acima de 128 na $?
representação do status de saída para codificar o número do sinal de um processo que está sendo morto e 126 e 127 para funções especiais. condições.
Você pode usar 126 a 255 exit()
para significar a mesma coisa que eles fazem para os shell $?
(como quando um script faz ret=$?; ...; exit "$ret"
). Usar valores fora de 0 -> 255 geralmente não é útil. Geralmente, você faria isso apenas se souber que o pai usará a waitid()
API em sistemas que não são truncados e se você precisar do intervalo de valores de 32 bits. Observe que, se você fizer um, exit(2048)
por exemplo, isso será visto como sucesso pelos pais usando as wait*()
APIs tradicionais .
Mais informações em:
Esperamos que as perguntas e respostas respondam à maioria das outras perguntas e esclareçam o significado de status de saída . Vou adicionar mais algumas coisas:
Um processo não pode terminar, a menos que seja morto ou faça as chamadas _exit()
/ exit_group()
system. Quando você retorna de main()
in C
, a libc chama essa chamada de sistema com o valor de retorno.
A maioria dos idiomas possui uma exit()
função que agrupa a chamada do sistema e o valor que eles assumem, se algum for geralmente passado como é para a chamada do sistema. (observe que geralmente fazem mais coisas como a limpeza feita pela exit()
função de C que libera os buffers stdio, executa os atexit()
ganchos ...)
Esse é o caso de pelo menos:
$ 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)
Ocasionalmente, você vê algumas reclamações quando usa um valor fora de 0 a 255:
$ echo 'm4exit(1234)' | strace -e exit_group m4
m4:stdin:1: exit status out of range: `1234'
exit_group(1) = ?
Algumas conchas reclamam quando você usa um valor negativo:
$ 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) = ?
O POSIX deixa o comportamento indefinido se o valor passado para o exit
built-in especial estiver fora de 0-> 255.
Algumas conchas mostram comportamentos inesperados se você:
bash
(e mksh
não pdksh
no qual se baseia) se encarrega de truncar o valor para 8 bits:
$ strace -e exit_group bash -c 'exit 1234'
exit_group(210) = ?
Portanto, nessas shells, se você quiser sair com um valor fora de 0-255, precisará fazer algo como:
exec zsh -c 'exit -- -12345'
exec perl -e 'exit(-12345)'
Ou seja, execute outro comando no mesmo processo que pode chamar a chamada do sistema com o valor desejado.
como mencionado nas outras perguntas e respostas, ksh93
tem o comportamento mais estranho para valores de saída de 257 a 256 + max_signal_number onde, em vez de chamar exit_group()
, ele se mata com o sinal correspondente¹.
$ ksh -c 'exit "$((256 + $(kill -l STOP)))"'
zsh: suspended (signal) ksh -c 'exit "$((256 + $(kill -l STOP)))"'
e trunca o número como bash
/ mksh
.
É provável que isso mude na próxima versão. Agora que o desenvolvimento ksh93
foi retomado como um esforço da comunidade fora da AT&T, esse comportamento, embora encorajado de alguma forma pelo POSIX, está sendo revertido
return
É, obviamente, um shell embutido.