2014-06-10 12 views
6

Sto scrivendo uno strumento che è scritto in python e C. Lo script python legge un file di configurazione, esegue alcune convalide effettua diverse chiamate al programma C.Impossibile scoprire quale codice di ritorno di -11 significa

sistema: RHE 5.7, pitone: 2.7.6, gcc : 4.5.2

Alcuni dei parametri al programma chiamato C sono i percorsi dei file di input. C'è un caso in cui il percorso del file di input è lo stesso per diverse invocazioni del programma C. In questo caso, solo la prima chiamata ha esito positivo e il codice di ritorno dal modulo subprocesso python è '-11'.

Non sono sicuro di come procedere. Per cominciare, non riesco a trovare la documentazione che indichi cosa potrebbe significare '-11' come stato di uscita. Non sembra essere nei codici 'standard' in /usr/include/sysexits.h. Sto indovinando che il codice potrebbe anche essere interpretato come 0xf5 o 245, dal momento che i codici di uscita sono creduti valori a 8 bit realmente firmati.

Ho aggiunto il debug all'inizio del programma C per stampare gli argomenti con cui è stato chiamato, ma non viene visualizzato nulla per le chiamate non riuscite. Posso capire come la C potrebbe fallire riaprendo un file che è stato letto sull'invocazione precedente (forse), ma il codice non arriva nemmeno lontano!

Quindi, da dove viene il codice di uscita? Proviene dall'ambiente (bash) che il modulo subprocesso python utilizza presumibilmente per richiamare il programma C? Proviene dal runtime C per il programma C prima che raggiunga anche il main?

Suppongo di poter progredire spostando il "ciclo" verso il basso in C, in modo che venga chiamato una sola volta per ogni percorso del file di input, ma ciò non spiega ancora questo comportamento. Qualcuno potrebbe spiegare come posso determinare la causa di questo errore? Grazie.

(FWIW) chiamando in pitone:

try: 
    subprocess.check_call(args) 
except subprocess.CalledProcessError as e: 
    print e 

iscrizione al C: uscita

printf("\n--- swizzle\n\nargs:\n"); 
for (int i = 0; i < argc; i++) printf("- %s\n", argv[ i ]); 

Errore:

Command '[..]' returned non-zero exit status -11 

risposta

10

Codice di ritorno -11 significa "segmentation fault". Un codice di ritorno negativo di solito significa che il processo è stato terminato da un segnale. Il codice di ritorno -11 significa che era il segnale 11, che è SIGSEGV.

+1

Grazie. Questo indica che il programma C è in esecuzione, si blocca e non riesce a produrre alcun output di debug. In effetti, se stampo gli argomenti e esco sempre, l'output appare per tutte le invocazioni. Questo è semplicemente un crash in C. Penso di aver lavorato in Python per così tanto tempo che mi sono accorto che mi aspettavo una traccia stack completa ad ogni eccezione. – PatB

+0

Ho avuto la stessa domanda e grazie per la risposta. Tuttavia, dov'è spiegato questo codice di uscita negativo ?? Stavo cercando di cercare su Google ma non ho trovato il documento che spiega questo. – yaobin

+1

@yaobin [Qui] (https://docs.python.org/3/library/subprocess.html#subprocess.Popen.returncode) 'Un valore negativo -N indica che il figlio è stato terminato dal segnale N (solo POSIX) .' – YvesgereY

Problemi correlati