Sto testando il codice che è progettato per rilevare quando un processo figlio ha un segfault. Immaginate la mia sorpresa quando questo codice non lo fa sempre segfault:Perché il programma Linux che derefrences (char *) 0 non è sempre segfault?
#include <stdio.h>
int main() {
char *p = (char *)(unsigned long)0;
putchar(*p);
return 0;
}
sto correndo sotto un 2.6.26 del kernel Linux Debian; la mia shell è l'AT & T ksh93
dal pacchetto Debian ksh
, Versione M 93s + 2008-01-31. A volte questo programma segfault ma altrimenti termina semplicemente in silenzio con uno stato di uscita diverso da zero ma nessun messaggio. Il mio programma del segnale di rilevamento riporta quanto segue:
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 11: Segmentation fault
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
segfault terminated by signal 53: Real-time signal 19
In esecuzione in puro ksh
mostra che la segfault è anche raro:
Running...
Running...
Running...
Running...
Running...
Running... Memory fault
Running...
È interessante notare che, bash
rileva correttamente la segfault ogni volta.
Ho due domande:
Qualcuno può spiegare questo comportamento?
Qualcuno può suggerire un semplice programma C che segusterà in modo affidabile ogni esecuzione? Ho anche provato
kill(getpid(), SIGSEGV)
, ma ottengo risultati simili.
EDIT: jbcreix ha la risposta: il mio rilevatore segfault era rotto. Sono stato ingannato perché lo ksh
ha lo stesso problema. Ho provato con bash
e bash
lo fa bene ogni volta.
Il mio errore era che stavo passando WNOHANG
a waitpid()
, dove avrei dovuto passare zero. Non so cosa avrei potuto pensare! Uno si chiede che cosa è il problema con ksh
, ma questa è una domanda a parte.
Cosa c'è di sbagliato con 'exit (0)'? Se vuoi che il bambino esca ... – pmg
Non voglio che il bambino esca --- Lo voglio segfault. Perché? Sto costruendo un rilevatore segfault e ho bisogno di un modo per testarlo! –
Norman, l'ho provato su vostra richiesta. Il mio codice funziona esattamente come ho detto, grazie. Non sai cosa c'è di sbagliato nel tuo sistema, forse il processo genitore che stai usando per catturare segnali AND ksh? Ho usato il kernel 2.6.28.7 per testare la risposta mmap. Funziona anche con raise (SIG_SEGV). –