2011-12-24 11 views
58

In un programma C se vogliamo dare qualche ingresso dal terminale allora possiamo dare da:Come posso ottenere ciò che la mia funzione principale ha restituito?

int main(int argc, char *argv[]) 

Allo stesso modo, se vogliamo ottenere valore restituito main() funzione allora come possiamo ottenerlo ?

In ogni main() scriviamo return 1 o return 0; come posso sapere cosa ha restituito il mio main() al terminale?

Edit: 1

ho capito che da echo $? possiamo ottenere il valore di ritorno di main() ma permette solo a me per restituire un valore inferiore a 125 (in Linux) con successo. Un valore restituito più di questo non può essere essere ricevuto con successo dal $ variable modo

il motivo per cui è int il tipo di ritorno di main()? Perché non tenerlo short int?

Edit2

Da dove posso scoprire il significato del codice di errore se main() restituisce un valore maggiore di 125?

+4

non c'è alcuna reale vantaggio di scegliere 'short' su' int' a meno che tu non ne abbia un sacco li nello stesso posto (array o struct).Non è più veloce avere un "short" e sugli ABI moderni spesso non si risparmia nemmeno spazio scegliendolo. In alcuni posti, 'short' è più lento perché devi eseguire l'estensione del segno quando lo carichi. –

+0

sorpreso da un downvote .. !!! –

+1

@Jeegar Patel .... devi capire che alcune persone sono sempre odiate –

risposta

45

La maggior parte delle shell memorizza il codice di uscita del comando di esecuzione precedente in $? in modo da poterlo archiviare o visualizzare.

$ ./a.out 
$ echo $?  # note - after this command $? contains the exit code of echo! 

o

$ ./a.out 
$ exit_code=$? # save the exit code in another shell variable. 

Nota che sotto linux, anche se si restituisce un int, in genere i valori solo meno di 126 sono sicuri da usare. Valori più alti sono riservati per registrare altri errori che potrebbero verificarsi quando si tenta di eseguire un comando o per registrare quale segnale, se presente, ha terminato il programma.

+2

Non so di un sapore UNIX che mantenga più del minimo 8 bit. –

+0

quando restituisco main() con -1 allora il suo show 127..how? –

+2

@ MikeDeSimone: ho appena controllato la pagina man di bash, ed è in realtà meno di quanto ricordassi. Se tenti di usare> 125 potresti scontrarti con i valori usati dalla shell. Non sono sicuro delle altre shell. –

40

La shell probabilmente ha una variabile speciale $?, che contiene l'ultimo valore restituito dal programma. Quindi, subito dopo la fine del programma, è possibile eseguire:

echo $? 

per visualizzare il valore restituito.

+0

quando restituisco main() con -1 quindi il suo show 127..come? –

+3

Vengono interpretati solo gli 8 bit bassi (ecco perché il valore restituito deve essere compreso nell'intervallo 0-255). Il 127 deriva dalla rappresentazione di numeri interi negativi che vengono quindi interpretati come non firmati. – sidyll

+6

@sidyll: Penso che intendiate 7-bit, non 8-bit. Gli 8 bit bassi di -1 sarebbero 255, i 7 bit bassi sono 127. –

31

In DOS/Windows è possibile utilizzare errorlevel all'interno di un file batch

executable optional arguments 
if errorlevel 4 goto LABEL4 
if errorlevel 3 goto LABEL3 
if errorlevel 2 goto LABEL2 
if errorlevel 1 goto LABEL1 
:SUCCESS 
echo SUCCESS; errorlevel 0 
goto :eof 
:LABEL1 
echo FAILURE; errorlevel 1 
goto :eof 
:LABEL2 
echo FAILURE; errorlevel 2 
goto :eof 
REM ... 

Basta ricordarsi di controllare dal più grande al più basso perché if errorlevel 42 significa veramente "se errorlevel è di 42 o superiore"

+9

-1 perché l'autore ha taggato la domanda con "linux". – AlexWebr

+4

+1 @Alex: buon punto. In mia difesa ho notato il tag solo dopo aver iniziato a scrivere la risposta --- e ho deciso di completarlo e postarlo – pmg

+12

+1 Buona risposta. Stavo cercando un metodo specifico per Windows, che probabilmente non ha bisogno di una domanda separata. – AbdullahC

6

Riassumendo commenti e frammenti, quindi sono in un unico posto.

programma A C ha sempre un codice uscita, che il programma può decidere autonomamente se termina normalmente, restituendo un valore dalla funzione main o chiamando la funzione exit. Se il programma termina in modo anomalo, ad esempio per un errore di segmentazione, il sistema operativo decide il codice di uscita.

In Unix (Posix), il codice di uscita è un valore a 8 bit: 0-255. È combinato con un altro metadati per un stato: l'altra metadati comprendono informazioni sul fatto che il programma è terminato normalmente oppure no, se è stata interrotta a causa di un segnale, e in caso affermativo, il quale segnale. Per i dettagli, vedere la pagina di manuale wait(2).

In Unix, in corrispondenza dello scafo, lo stato del comando precedente è accessibile come variabile speciale $?. Poiché il codice di uscita è solo 8 bit, ed è trattato come un intero senza segno, se si restituisce un valore negativo, esso viene trasformato in positivo: -1 diventa 255. Analogamente, se si restituisce un valore maggiore di un'unica almeno 255 significativi 8 bit sono utilizzati: 256 diventa 0.

Il tipo di ritorno di main è int, anziché short o char, perché non c'è beneficio particolare nel rendere un tipo più piccolo, in particolare a questo punto della storia, decenni dopo è stato deciso. Cambiarlo ora causerebbe solo inutili complicazioni.

Se si desidera eseguire un programma da C, la libreria standard fornisce la funzione system, che restituisce facilmente lo stato del programma. (Si noti che system esegue i comandi tramite la shell e si deve fare molta attenzione a eseguire correttamente l'escape se si fornisce al comando nomi di file o altre cose sulla riga di comando.)

Per maggiore flessibilità, è possibile eseguire altri programmi che utilizzano il sistema chiama fork, execl (o una delle sue varianti, vedere la pagina di manuale exec(3)) e wait (già menzionato sopra). Questo è potente e flessibile, ma è anche facile fare errori, quindi assicuratevi di leggere la documentazione e verificare alcuni programmi di esempio prima. (D'altra parte, è molto divertente imparare questa roba.)

3

È possibile ottenere i valori di uscita con il comando di base di linux echo $? I codici di errore sono standard ed i dettagli sono spiegati in questo link

I codici generali sono

**

0- successo

1- errori generali

126- Permissi sul tema

127-illegale comando

128-Invalid argomenti e gli errori fatali

255-Out of range **

Problemi correlati