PDA

Visualizza la versione completa : return code: linee guida?


GreyFox86
24-06-2008, 20:10
Mi chiedevo... esistono da qualche parte delle linee guida su che codici di ritorno usare per i programmi in linux? Non intendo un semplice 0=>ok e !0=>errore, mi riferisco a qualcosa di più raffinato.
Per esempio ho notato che sul mio sistema la terminazione di un programma tramite segfault genera un codice 139. Ma è uguale ovunque o può cambiare?
Ho googlato un po' ma non trovo nulla.

GunMan
24-06-2008, 21:02
a suo tempo cercai anch'io un'informazione simile, alla fine ho trovato in questa (http://www.pegasoft.ca/resources/boblap/99_b.html) pagina un ottimo spunto iniziale.

anche nelle varie man pages si possono trovare riferimenti e/o nel file /usr/include/asm-generic/errno.h

spero possa aiutare :)

:ciauz:

GreyFox86
24-06-2008, 21:07
E' già un punto di partenza ti ringrazio.

edit: Cmq nelle man non riesco a trovare nulla.

U-bahn
25-06-2008, 09:48
Originariamente inviato da GreyFox86
Mi chiedevo... esistono da qualche parte delle linee guida su che codici di ritorno usare per i programmi in linux? Non intendo un semplice 0=>ok e !0=>errore, mi riferisco a qualcosa di più raffinato.
Per esempio ho notato che sul mio sistema la terminazione di un programma tramite segfault genera un codice 139. Ma è uguale ovunque o può cambiare?
Ho googlato un po' ma non trovo nulla.

I codici di errore si trovano nella libreria standard (man 3 errno) e sono
gli stessi per tutti (poi ci sono le estensioni etc., ma questa è un'altra storia).

Comunque, non esiste qualcosa di più raffinato: ogni sistema operativo
interpreta il valore restituito da un programma come gli pare e, per evitare
spiacevoli inconvenienti, è bene usare gli unici valori di ritorno definiti
dallo standard ANSI, ovvero EXIT_SUCCESS, EXIT_FAILURE (i valori dei quali
dipendono comunque dalla libreria usata) e 0 (questo è sempre valido
ed utilizzabile al posto di EXIT_SUCCESS, ma non è detto che abbiano
per forza lo stesso valore)...

D'altro canto, se non ti interessa che un tuo programma sia valido
per TUTTI gli altri compilatori standard, puoi fare quello che vuoi,
ma non è detto che una futura versione di <un_qualsiasi_kernel/altro_programma>
non vada in crash perché ha ricevuto un valore che non gli piaceva. :D


In ogni caso, se proprio devi, è meglio utilizzare le macro in errno.h,
piuttosto che valori a caso (infatti potresti per combinazione restituire
un codice di errore in realtà corrispondente a EXIT_SUCCESS).

:ciauz:

P.S.: se vuoi un consiglio, quando il tuo programma incontra un errore fatale,
stampa un messaggio o comunica il codice ad altri programmi tramite
socket/pipe/file temporanei, poi esci con EXIT_FAILURE.

ah, ovviamente il tutto per quanto riguarda i programmi in C(++)... :zizi:

sacarde
25-06-2008, 09:57
io credo che ogni programma abbia i suoi exit status


esempio bash, ne ha alcuni fissi:

http://www.pluto.it/files/ildp/guide/abs/exitcodes.html#EXITCODESREF

U-bahn
25-06-2008, 09:59
sì, ma gli script restituiscono il valore alla shell, non al kernel :bhò:

GreyFox86
25-06-2008, 19:45
La mia domanda non era solo atta a sapere che valori ritornare nei miei programmi (sono solito usare sempre EXIT_SUCCESS ed EXIT_FAILURE), ma anche su quali valori potermi basare per decidere che azioni compiere negli script bash quando controllo la variabile $?.
Ho fatto uno scriptino che mantiene running un programma, nel senso che se crasha lo riavvia. Solo che prima di controllare proprio per il codice 139 che ho nominato sopra volevo essere sicuro che ci fossero delle convenzioni fisse dietro. Al momento controllo semplicemente che sia diverso da 0.

U-bahn
25-06-2008, 22:55
Ah ok, come non detto :D...

...comunque, allora, non stiamo parlando dello stato di uscita
di un programma, ma dello stato in cui è terminato. :)

Ovvero: la variabile $?, nella bash, può contenere il valore restituito
con exit o return, se un programma termina normalmente la sua esecuzione
(stato di uscita), oppure uno dei codici di uscita riservati della bash,
se viene interrotto in modo anomalo.

Ad esempio, come puoi vedere dal link che ha postato sacarde,
il valore 139, restituito in caso di segmentation fault, è ottenuto
dalla somma di 128 (riservato: interruzione dell'esecuzione
del programma a causa di un errore fatale) ed 11,
ovvero il segnale SIGSEGV (per l'elenco dei segnali: `man 7 signal`).

Il problema è che il valore di $? dipende sia dal comportamento
del programma, che dal sistema/architettura; es.:
1) i valori dei segnali non sono uguali per tutti, quindi il significato
di 139 può variare;
2) un programma che cerca di gestire il SIGSEGV e che esce
con `return <qualcosa>`, termina correttamente la propria esecuzione:
$? avrà cosi il valore di <qualcosa> (magari EXIT_FAILURE),
anche se il programma è terminato per colpa di un segmentation fault.


Spero di esserti stato utile... :zizi: :bhò:

GreyFox86
26-06-2008, 16:18
Chiarissimo, eviterò di usarli allora.
Grazie a tutti :D

Loading