关于signal()函数的奇怪'SIGSEGV'性能

问题描述:

我有3个示例小程序来描述我在这里的困惑。关于signal()函数的奇怪'SIGSEGV'性能

首先,一个典型的分段错误的程序是这样的:

#include <stdio.h> 
main() 
{  
    int *p=NULL; 
    *p=0; //here will cause a SIGSEGV signal 
} 

当我运行上面的小程序,终端会显示

# ./a.out 
Segmentation fault 

接下来,我添加applet中的signal()函数,则它将如下所示:

#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; 
} 

当我运行上面的小程序,终端会显示

# ./a.out 
It's SIGSEGV! 

最后,我删除applet的空字符串,它会成功运行!!:

#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; 
} 

结果是

# ./a.out 
The value of p is 0 

为什么?

解引用未初始化的指针是未定义的行为。任何事情都可能发生。程序被破坏,你无法推理它。