J'ai 3 exemples d'applets pour décrire ma confusion ici.Étrange performance 'SIGSEGV' à propos de la fonction signal()
D'abord, un programme de défaut de segmentation classique est comme ceci:
#include <stdio.h>
main()
{
int *p=NULL;
*p=0; //here will cause a SIGSEGV signal
}
Quand je lance l'applet ci-dessus, le terminal montrera
# ./a.out
Segmentation fault
Ensuite, ajouter une fonction signal() dans l'applet, alors il ressemblera à ceci:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void handler(int s)
{
if(s==SIGSEGV)
printf("It's SIGSEGV!\n");
exit(1);
}
main()
{
int *p=NULL;
signal(SIGSEGV,handler);
*p=0;
return 0;
}
Quand je lance l'applet ci-dessus, le terminal affichera
# ./a.out
It's SIGSEGV!
Enfin, je supprime la chaîne NULL dans l'applet, il fonctionnera SUCCES !!:
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
void handler(int s)
{
if(s==SIGSEGV)
printf("It's SIGSEGV!\n");
exit(1);
}
main()
{
int *p; //There is no more 'NULL' here
signal(SIGSEGV,handler);
*p=0;
printf("The value of p is %d\n",*p);
return 0;
}
Le résultat est
# ./a.out
The value of p is 0
Pourquoi?