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

时间:2014-06-06 10:02:43

标签: c signals sigsegv

我有3个示例小程序来描述我的困惑。

首先,经典的分段错误程序是这样的:

#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中的NULL字符串,它将运行SUCCESSFULLY !!:

#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

为什么?

1 个答案:

答案 0 :(得分:4)

取消引用未经初始化的指针是未定义的行为。任何事情都可能发生。程序被破坏了,你不能用它来推理。