Il messaggio "Errore di segmentazione" rientra in STDERR?


17

Ho eseguito un eseguibile dentro bash

./code > log

Mostra messaggi di errore occasionali sul terminale mentre tutte le istruzioni printf vanno nel file di registro. Lo rieseguo come di seguito

./code >& log

Ora, anche i messaggi di errore occasionali vanno nel registro. Ma se c'è un errore di segmentazione, viene comunque mostrato sul terminale. Perché? Come far Segmentation fault (core dumped)andare il messaggio nel file di registro?


user $ bash --version

GNU bash, versione 4.2.24 (1) -release (i686-pc-linux-gnu)

Risposte:


14

Un errore di segmentazione è un segnale, se non lo si rileva, il programma verrà terminato e la shell lo stamperà sul suo standard (anziché sullo standard del programma).

È possibile che il tuo programma o la shell eseguano azioni specifiche quando ciò accade, sia dal programma che cattura il segnale o che la tua shell intrappola il segnale SIGCHILD e quindi controlla lo stato di uscita di tuo figlio.


1
@ user13107help trap
Carlos Campderrós il

2
Sì. fatto. se qualcuno è interessato, ecco cosa ho fatto pastebin.com/QyeJYYHC
user13107

1
Il trapcomando shell intrappola i segnali inviati alla shell . Quindi non funzionerà per catturare quello che viene inviato al tuo programma.
derobert,

1
@ warl0ck è possibile catturare un segfault nello stesso modo in cui si cattura qualsiasi segnale, tuttavia questo può portare a un comportamento indefinito, ma se sai cosa stai facendo potresti essere almeno in grado di morire in modo sensato. L'OP voleva stampare su stderr, in questo caso catturare il segfault e la stampa è sicura.
cjh

1
@ warl0ck: puoi, è una pessima idea fare qualsiasi cosa nel gestore, tranne accedere e uscire. Vi sono tuttavia alcuni casi d'uso specializzati.
Linuxios,

19

Il messaggio di "errore di segmentazione" viene stampato su stderr, ma è l'errore standard della shell, non l'errore standard del programma. La shell stampa questo messaggio quando rileva che il programma è terminato a causa di un segnale.

È possibile silenziare il messaggio reindirizzando stderr attorno alla parte dello script della shell che esegue il programma:

{ ./code; } >&log
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.