C语言和指针-回顾21-signal

信号

SIGSEGV

提示程序试图访问非法访问内存。

最常见的原因:

  1. 程序试图访问未安装于机器上的内存 或者 访问操作系统未分配给这个程序的内存
  2. 程序违反了内存访问的边界要求。比如可能发生在那些要求数据边界对齐的机器上。
SIGINT

用户使用中断程序时发生。

 

signal()函数

函数原型:void (*signal(int sig, void (* handler) (int) ) ) (int);

忽略函数的返回值的话:signal(int sig, void (* handler)(int))

函数的返回值是一个函数指针: void (*p)(int)。

其实跟函数的第二个参数一样的类型。

返回的是信号以前的处理函数的指针。

 

当信号发生时,程序有3种方式对信号做出反应:

  1. 缺省的反应是由编译器定义的,通常是终止程序。
  2. 信号可以被忽略:signal(sig, SIG_IGN)。signal(sig, SIG_DFL)恢复对信号的缺省反应。
  3. 程序可以设置信号处理函数,当信号发生是调用这个信号处理函数。

 

信号处理函数

书中有这段描述。不知道应该怎么理解。如果缺省的行为是终止程序,那设置的信号处理函数就不执行了吗?

 

还有这两段描述。也就是说信号处理函数里面除了访问和修改valatile sig_atomic_t类型的变量之外,别的什么都不能干了别?

 

sig_atomic_t

定义了一种CPU可以原子访问的数据类型,也就是不可分割的访问单元。

 

valitale数据

posted @ 2021-07-10 14:40  Erden  阅读(70)  评论(0编辑  收藏  举报