信号
SIGSEGV
提示程序试图访问非法访问内存。
最常见的原因:
- 程序试图访问未安装于机器上的内存 或者 访问操作系统未分配给这个程序的内存
- 程序违反了内存访问的边界要求。比如可能发生在那些要求数据边界对齐的机器上。
SIGINT
用户使用中断程序时发生。
signal()函数
函数原型:void (*signal(int sig, void (* handler) (int) ) ) (int);
忽略函数的返回值的话:signal(int sig, void (* handler)(int))
函数的返回值是一个函数指针: void (*p)(int)。
其实跟函数的第二个参数一样的类型。
返回的是信号以前的处理函数的指针。
当信号发生时,程序有3种方式对信号做出反应:
- 缺省的反应是由编译器定义的,通常是终止程序。
- 信号可以被忽略:signal(sig, SIG_IGN)。signal(sig, SIG_DFL)恢复对信号的缺省反应。
- 程序可以设置信号处理函数,当信号发生是调用这个信号处理函数。
信号处理函数
书中有这段描述。不知道应该怎么理解。如果缺省的行为是终止程序,那设置的信号处理函数就不执行了吗?
还有这两段描述。也就是说信号处理函数里面除了访问和修改valatile sig_atomic_t类型的变量之外,别的什么都不能干了别?
sig_atomic_t
定义了一种CPU可以原子访问的数据类型,也就是不可分割的访问单元。