Storia Unix: codice di ritorno ottale?


10

Sono stato gettato alla sprovvista oggi da gdb:

Program exited with code 0146.

gdbstampa il codice di ritorno in ottale ; esaminando perché ho trovato: http://comments.gmane.org/gmane.comp.gdb.devel/30363

Ma questa non è una risposta particolarmente soddisfacente. Alcuni rapidi googling non hanno rivelato la storia, quindi speravo che qualcuno su SO potesse conoscere la storia precedente.

Una domanda in qualche modo correlata, come si potrebbe visualizzare il codice di ritorno in ottale? Forse le macchine più vecchie stampavano sempre il codice di ritorno?

$ printf %o\\n $?

È piuttosto imbarazzante :)


il $?è il valore della shell per il codice di ritorno, ed è una cifra decimale (o supportate da gdb tuo esempio cmd anche?). Non so perché gdb lo riporta in ottale. La mia soluzione è quella di uscire dal vecchio man asciiper vedere cosa significano i valori ottali. Domanda interessante, dato che ti imbatti in valori ottali anche da altri programmi. Forse è discusso in "Unix Programming Envioronment" di Kernighan e Pike. In bocca al lupo.
shellter

Lo stato di uscita può essere maggiore di una cifra, in realtà è un byte. Inoltre, man asciisarebbe inutile convertire l'ottale in decimale. bcsarebbe una scelta migliore.
jlliagre,

2
Il codice di ritorno è un numero , non decimale o ottale. Il programma restituisce uno stato (un byte). Con wait (3) o la sua tribù il processo genitore può scoprire molte informazioni sul perché il processo è uscito (normalmente, cioè volontariamente chiamando exit (2); ucciso da un segnale, ...)
vonbrand

Risposte:


6

La rappresentazione ottale facilita l'interpretazione del codice di uscita per piccoli valori, che sono i più comunemente usati. Se questo numero, che è un byte, è stato stampato in decimale, trovando quale segnale ha interrotto un processo richiederebbe un po 'di calcolo mentre in ottale, possono essere letti così come sono:

  • un processo esce con lo stato 5, gdbdisplay 05che non fa alcuna differenza
  • un processo termina perché ha un SIGINT( Control+ C), gdbdisplay 0202che è più facile da riconoscere come segnale n. 2 di 130.

Inoltre, lo stato di uscita potrebbe anche essere una maschera di bit e in tal caso, ottale (almeno quando ci si è abituati, che era più comune un paio di decenni fa di questi giorni) è più facile convertire mentalmente in bit che decimale o addirittura esadecimale, proprio come per esempio chmodancora accettare un numero ottale per rappresentare i permessi dei file: 0750 = 111 101 000 = rwx r-x ---.


probabilmente il posto sbagliato per chiedere questo, ma c'è un modo semplice per dire se un numero dato da GDB è in ottale o decimale?
marinara,

3
La convenzione è se inizia con zero (0), è ottale.
jlliagre,

3

Non ho una copia di questo testo e ho appena letto il breve testo disponibile su Google Libri, ma. Secondo la X / Open Portability guide System V Specification Commands & Utilities pg 283 (secondo google books)

se un'applicazione termina in modo anomalo, il suo stato di uscita è 0200+ stato e c'è un elenco di valori comuni di "stato" (che probabilmente sono indicati anche in ottale).

Quindi è / è stato un messaggio di errore mans mans.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.