首页 > 编程语言 > 详细

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

时间:2021-07-10 16:11:36      阅读:14      评论:0      收藏:0      [点我收藏+]

信号

技术分享图片

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数据

技术分享图片

技术分享图片

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

原文:https://www.cnblogs.com/wuyuntana/p/14993807.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!