2011-11-10 17 views
10

Ho un programma C che restituisce un valore intero. Sono rimasto sorpreso di scoprire che in sede di esame il valore restituito dal prompt della shell ottengo il valore del modulo 256.Qual è l'intervallo valido per il valore di ritorno del programma in Linux/bash?

/* prog.c */ 
int main(...) { return 257; } 

-

> ./prog.e 
> echo $? 
1 
  • Perché non vedo l'intero intero ?
  • Dove viene documentato questo comportamento?
  • Come posso ottenere l'intero valore a 32 bit nella shell?
+3

I valori di ritorno sono per definizione codici di errore. Non è possibile utilizzare il valore restituito per comunicare un altro valore numerico, è * necessariamente * utilizzato per indicare il successo (0) o un errore (diverso da zero). Se il tuo intento è di generare un qualche tipo di conteggio o altro valore numerico diverso da zero durante l'esecuzione * di successo, devi scriverlo su STDOUT. – meagar

+0

Grazie, @meagar. Ho bisogno di questo come un trucco temporaneo su un codice di non produzione su cui lavoro - per verificare lo sviluppo del mio codice incorporato. Capisco l'avvertenza che hai citato, ma tuttavia non risponde alla mia domanda. – ysap

+0

Ecco perché è un commento, non una risposta.I commenti non sono * supposti * per rispondere alle domande. Abbraccio temporaneo o altro, non sarai in grado di mantenere il numero che stai restituendo. Dovrai inviarlo a STDOUT. – meagar

risposta

10

quando un programma uscite, si può tornare al processo padre una piccola quantità di informazioni sulla causa di risoluzione, utilizzando lo stato di uscita. Questo è un valore compreso tra 0 e 255 che il processo in uscita passa come argomento per uscire.

http://www.gnu.org/s/hello/manual/libc/Exit-Status.html

alternativa:

http://en.wikipedia.org/wiki/Exit_status

provenivano da "Codici di ritorno POSIX" e "C" di ritorno codici rispettive ricerche di Google.

+0

Grazie. Immagino di essere fuori di fortuna qui. – ysap

1

Lo stato di ritorno viene spiegato (una sorta di) nello wait e nelle relative syscalls.

Fondamentalmente:

WEXITSTATUS (stat_val)
Se il valore di WIFEXITED (stat_val) è diverso da zero, questa macro restituisce basso per 8 bit dell'argomento status che il processo figlio passato a _exit() o exit() o al valore restituito dal processo figlio da main().

Quindi è limitato a 8 bit. Non puoi ottenerne di più. (E non so sistema metodi dipendenti per ottenere più neanche.)

3

La spiegazione si trova proprio in cima man exit:

 
    The exit() function causes normal process termination and the value of 
    status & 0377 is returned to the parent (see wait(2)). 

In altre parole, solo i più bassi 8 bit vengono propagate al processo genitore.

In questo senso, restituire il codice di uscita da main() non è diverso dal passarlo a exit().

+0

Grazie. In realtà ho cercato nella pagina 'man bash' ma non sono riuscito a trovarlo. Immagino che b/c stavo facendo C non ho pensato di guardare la pagina 'exit'. – ysap

Problemi correlati