关于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
为什么?
答
解引用未初始化的指针是未定义的行为。任何事情都可能发生。程序被破坏,你无法推理它。