0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux操作系统编程讲解:信号捕捉

如意 来源:良许Linux 作者:良许 2020-10-19 15:10 次阅读

前面我们学习了信号产生的几种方式,而对于信号的处理有如下几种方式:

默认处理方式;

忽略;

捕捉。

信号的捕捉,说白了就是抓到一个信号后,执行我们指定的函数,或者执行我们指定的动作。下面详细介绍两个信号捕捉操作参数:signal和sigaction。

##signal函数

函数原型:

sighandler_t signal(int signum, sighandler_t handler);

其中,sighandler定义是这样的:typedef void (*sighandler_t)(int);

函数作用:注册一个信号捕捉函数,也就是说,收到了某个信号,就执行它所注册的回调函数。

函数参数:

signum:信号编号,尽量用宏来写,而别用数字,这样更适合跨平台;

handler:注册的回调函数;

函数缺陷:

由于历史原因,该函数在不同版本的Unix和Linux系统中可能起到的效果不一样,所以跨平台性不佳,尽量避免使用它,取而代之使用通用性更好的sigaction函数。

Linux操作系统编程讲解:信号捕捉

##sigaction函数

函数原型:

int sigaction(int signum, const struct sigaction act, struct sigaction oldact);

函数作用:与signal函数类似,用来注册一个信号捕捉函数;

返回值:

成功:0;失败:-1,并设置errno;

参数:

signum:信号编号,尽量用宏来写,而别用数字,这样更适合跨平台;

act:传入参数,新的信号捕捉方式;

oldact:传出参数,旧的信号捕捉方式

这里特别要注意参数中struct sigaction结构体,这也是这个函数的难点所在,下面详细说明:

struct sigaction结构体

原型:

Linux操作系统编程讲解:信号捕捉

这个结构体成员很多,又很多是回调函数的形式,令人望而生畏。但实际上,需要掌握的只有三个。

首先,sa_restorer和sa_sigaction这两个成员一个已经被弃用了,另一个很少使用,所以我们暂且不管它们,重点掌握剩下的三个。

(1) sa_handler:指定信号捕捉后的处理函数,即注册回调函数。该成员也可以赋值为SIG_IGN,表示忽略该信号,也可注册为SIG_DFL,表示执行信号的默认动作。

(2) sa_mask:临时阻塞信号集(或信号屏蔽字)先来看这样一个情景:

某个信号已经注册了回调函数,当内核传递这个信号过来时,会先经过一个阻塞信号集,先阻塞掉部分信号。再去执行对应的回调函数。如下图示:

Linux操作系统编程讲解:信号捕捉

假如说,这个回调函数回调执行的时间比较长,比如2秒,在这2秒里,又有其它的信号过来,那进程是暂停当前回调函数,去响应新的信号,还是不管新来的信号,先把当前回调函数处理完再说?

正确的做法是,在执行回调函数期间,使用sa_mask临时的去替代进程的阻塞信号集,保证回调函数安心的执行完毕,再解除替代。注意:这个过程仅仅发生在回调函数执行期间,是临时性的设置。

(3) sa_flags:通常设置为0,表示使用默认属性。

再来看另外一个场景:

比如进程对SIGQUIT注册了回调函数,当回调函数在执行期间,又来了SIGQUIT函数,这时,进程是响应还是不响应该信号?这就是sa_flags的一个作用,当其设置为0时,表示使用默认属性,也就是先不响应该信号,而是执行完回调函数再处理此信号。

另外,阻塞的常规信号不支持排队,也就是说,执行回调函数期间,再来千百个同个信号时,系统只记录一次。而后面的32个实时信号则支持排队。

Linux操作系统编程讲解:信号捕捉


责编AJX

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206725
  • 操作系统
    +关注

    关注

    37

    文章

    6280

    浏览量

    121870
  • 信号
    +关注

    关注

    11

    文章

    2636

    浏览量

    75380
收藏 人收藏

    评论

    相关推荐

    Linux系统编程

    Linux系统编程
    发表于 03-03 10:26

    原创丨Linux系统编程篇丨迅为IMX6ULL-对应视频讲解

    本章内容对应视频讲解链接(在线观看):什么是 Linux 系统编程呢?Linux 系统编程也叫 Linu
    发表于 07-30 10:39

    Linux操作系统安装与使用

    嵌入式网络编程+嵌入式Linux系统一、Linux操作系统安装与使用(命令)二、Linux开发工
    发表于 11-05 08:25

    为何将Linux操作系统划分为用户和内核

    linux_C网络编程概述嵌入式网络编程==嵌入式Linux_C系统编程(文件、进程、进程间通信、多线程、网络、大并发网络服务器、数据库、s
    发表于 12-15 08:35

    Linux操作系统安装与使用

    嵌入式网络编程+嵌入式Linux系统Linux操作系统安装与使用(命令)Linux开发工具(gc
    发表于 12-22 07:47

    Linux操作系统安装与使用方法

    嵌入式网络编程+嵌入式Linux系统Linux操作系统安装与使用(命令)Linux开发工具(gc
    发表于 12-23 06:57

    什么是Linux系统编程

    什么是Linux系统编程Linux系统编程也叫Linux下的高级编程,是介于应用层和驱动层之间
    发表于 12-23 07:30

    是否可以为linux操作系统编译并在基于debian的rasperry操作系统中运行?

    STM32CubeProgrammer 有一个 C++ API,允许创建使用 qt creator 编译的程序。是否可以为 linux 操作系统编译并在基于 debian 的 rasperry 操作系统中运行?
    发表于 12-06 06:01

    Linux操作系统

    linux的教学内容1 、Linux概述 2 、Linux操作系统安装3、 Linux的内核 4 、Li
    发表于 04-10 16:54 0次下载
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>

    基于Linux操作系统下C语言编程入门

    基于Linux操作系统下C语言编程入门
    发表于 10-27 15:36 11次下载
    基于<b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>下C语言<b class='flag-5'>编程</b>入门

    linux系统编程_中文版

    linux系统编程_中文版
    发表于 10-29 10:17 0次下载
    <b class='flag-5'>linux</b><b class='flag-5'>系统编程</b>_中文版

    Linux操作系统知识讲解:走进内存

    Linux操作系统知识讲解:走进内存
    的头像 发表于 08-28 10:30 2124次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>知识<b class='flag-5'>讲解</b>:走进内存

    Linux操作系统知识讲解:避免内存使用七大坑

    Linux操作系统知识讲解:避免内存使用七大坑
    的头像 发表于 08-28 11:12 2625次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系统</b>知识<b class='flag-5'>讲解</b>:避免内存使用七大坑

    为什么我们要掌握Linux系统编程

    为什么我们要掌握Linux系统编程
    的头像 发表于 05-17 10:00 610次阅读

    Linux 系统编程的难点是什么

    对于有一定 Linux 开发基础希望进阶学习 Linux 系统编程的开发人员来说,其难点在于,Linux 所囊括的技术点繁杂,往往不知从何下手。
    发表于 06-28 12:54 391次阅读