Je suis en train de tester un code qui est conçu pour détecter le moment où un processus enfant est ségrégé. Imaginez ma surprise lorsque ce code ne fonctionne pas toujours segfault:Pourquoi le programme Linux qui derefrences (char *) 0 pas toujours segfault?
#include <stdio.h>
int main() {
char *p = (char *)(unsigned long)0;
putchar(*p);
return 0;
}
je tourne un noyau Debian Linux 2.6.26; mon shell est le AT & T ksh93
du paquet Debian ksh
, version M 93s + 2008-01-31. Parfois, ce programme segfault mais sinon il se termine simplement silencieusement avec un statut de sortie différent de zéro mais aucun message. Mon programme de signaux de détection indique ce qui suit:
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
Fonctionnant sous pur ksh
montre que le segfault est aussi rare:
Running...
Running...
Running...
Running...
Running...
Running... Memory fault
Running...
Fait intéressant, bash
détecte correctement le segfault chaque fois.
J'ai deux questions:
Quelqu'un peut-il expliquer ce comportement? Est-ce que quelqu'un peut suggérer un programme C simple qui va segfault de façon fiable à chaque exécution? J'ai aussi essayé
kill(getpid(), SIGSEGV)
, mais j'obtiens des résultats similaires.
EDIT: jbcreix a la réponse: mon détecteur de segfault a été brisé. J'ai été dupe parce que ksh
a le même problème. J'ai essayé avec bash
et bash
obtient le droit chaque fois. Mon erreur était que je passais WNOHANG
à waitpid()
, où j'aurais dû passer zéro. Je ne sais pas ce que j'aurais pu penser! On se demande quel est le problème avec ksh
, mais c'est une question distincte.
Quel est le problème avec 'exit (0)'? Si vous voulez que l'enfant sorte ... – pmg
Je ne veux pas que l'enfant sorte --- je veux que ça segfault. Pourquoi? Je construis un détecteur de segfault et j'ai besoin d'un moyen de le tester! –
Norman, je l'ai testé à votre demande. Mon code fonctionne exactement comme je l'ai dit, merci. Vous ne savez pas ce qui ne va pas sur votre système, peut-être le processus parent que vous utilisez pour attraper les signaux ET ksh? J'ai utilisé le noyau 2.6.28.7 pour tester la réponse mmap. Fonctionne également avec raise (SIG_SEGV). –