História Unix: código de retorno octal?

10

Hoje fui pego de surpresa por gdb:

Program exited with code 0146.

gdbimprime o código de retorno em octal ; procurando por que encontrei: http://comments.gmane.org/gmane.comp.gdb.devel/30363

Mas essa não é uma resposta particularmente satisfatória. Uma pesquisa rápida no Google não revelou a história, então eu esperava que alguém na SO conhecesse a história por trás.

Uma pergunta um tanto relacionada, como alguém veria o código de retorno em octal? Talvez máquinas mais antigas sempre imprimissem o código de retorno?

$ printf %o\\n $?

É muito estranho :)

Pat
fonte
o $?é o valor do shell para o código de retorno e é um dígito decimal (ou o gdb também suporta o seu exemplo de cmd?). Não sei por que o gdb o informa em octal. Minha solução é sair do campo man asciipara ver o que significam os valores octais. Pergunta interessante, como você também encontra valores octais de outros programas. Talvez isso seja discutido no 'Unix Programming Envioronment' de Kernighan e Pike. Boa sorte.
shellter
O status de saída pode ser maior que um dígito, na verdade é um byte. Além disso, man asciiseria inútil converter octal em decimal. bcseria uma escolha melhor.
Jlliagre
2
O código de retorno é um número , não decimal ou octal. O programa retorna um status (um byte). Com wait (3) ou sua tribo, o processo pai pode descobrir muitas informações sobre por que o processo foi encerrado (normalmente, ou seja, voluntariamente chamando exit (2); morto por um sinal, ...)
vonbrand

Respostas:

6

A representação octal facilita a interpretação do código de saída para valores pequenos, que são os mais usados. Se esse número, que é um byte, for impresso em decimal, descobrindo qual sinal interrompeu um processo exigiria um pouco de cálculo enquanto em octal, eles podem ser lidos como estão:

  • um processo sai com o status 5, gdbexibe o 05que não faz diferença
  • um processo sai porque recebeu um SIGINT( Control+ C), gdbexibe 0202que é mais fácil reconhecer como sinal # 2 do que 130.

Além disso, o status de saída também pode ser uma máscara de bits e, nesse caso, octal (pelo menos quando você está acostumado a isso, que era mais comum algumas décadas atrás do que atualmente) é mais fácil de converter mentalmente em bits do que decimal ou mesmo hexadecimal, como, por exemplo, chmodainda aceitam um número octal para representar as permissões de arquivo: 0750 = 111 101 000 = rwx r-x ---.

jlliagre
fonte
provavelmente o lugar errado para perguntar isso, mas existe uma maneira fácil de saber se um número fornecido pelo GDB está em octal ou decimal?
Marinara
3
A convenção é que, se começar com zero (0), é octal.
Jlliagre 11/11/11
3

Eu não tenho uma cópia deste texto e apenas li a breve sinopse disponível no google books, mas. De acordo com o Guia de portabilidade X / Open, comandos e utilitários de especificação do Sistema V pág. 283 (de acordo com o google books)

se um aplicativo terminar de forma anormal, seu status de saída é octal 0200 + e há uma lista de valores comuns de 'status' (que provavelmente também são fornecidos em octal).

Portanto, é / foi uma mensagem de erro do homem pobre.


fonte