Ich teste Code, der entwickelt wurde, um zu erkennen, wenn ein untergeordneter Prozess segfailed ist. Stellen Sie sich meine überrascht, wenn dieser Code nicht immer segfault:Warum deklariert Linux-Programm (char *) 0 nicht immer segfault?
#include <stdio.h>
int main() {
char *p = (char *)(unsigned long)0;
putchar(*p);
return 0;
}
Ich bin unter einem Debian Linux 2.6.26-Kernel ausgeführt wird; Meine Shell ist die AT & T ksh93
aus dem Debian ksh
Paket, Version M 93s + 2008-01-31. Manchmal wird dieses Programm segfault, aber ansonsten wird es einfach still mit einem Nicht-Null-Exit-Status, aber ohne Nachricht beendet. Mein signaldetektierenden Programm meldet folgende:
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
Laufen unter reinen ksh
zeigt, dass der segfault auch selten:
Running...
Running...
Running...
Running...
Running...
Running... Memory fault
Running...
Interessanterweise bash
richtig erkennt die segfault jedes Mal.
Ich habe zwei Fragen:
Kann jemand dieses Verhalten erklären?
Kann jemand ein einfaches C-Programm vorschlagen, das bei jeder Ausführung zuverlässig segfault? Ich habe auch versucht
kill(getpid(), SIGSEGV)
, aber ich bekomme ähnliche Ergebnisse.
EDIT: jbcreix hat die Antwort: mein segfault Detektor defekt war. Ich wurde getäuscht, weil ksh
das gleiche Problem hat. Ich habe versucht mit bash
und bash
bekommt es jedes Mal richtig.
Mein Fehler war, dass ich WNOHANG
an waitpid()
übergeben habe, wo ich Null hätte übergeben sollen. Ich weiß nicht, was ich hätte denken können! Man fragt sich, was ist los mit ksh
, aber das ist eine separate Frage.
Was mit 'Ausgang falsch (0)'? Wenn Sie möchten, dass das Kind beendet wird ... – pmg
Ich möchte nicht, dass das Kind austritt --- Ich möchte, dass es segfault. Warum? Ich baue einen Segfault-Detektor und ich muss ihn testen! –
Norman, ich habe es auf Ihre Anfrage getestet. Mein Code funktioniert genau so, wie ich es sagte, danke. Nicht sicher, was auf Ihrem System falsch ist, vielleicht der Elternprozess, den Sie verwenden, um Signale UND ksh abzufangen? Ich habe den Kernel 2.6.28.7 verwendet, um die mmap-Antwort zu testen. Funktioniert auch mit Raise (SIG_SEGV). –