4290|0

298

帖子

1

TA的资源

禁止发言

楼主
 

iTOP4412开发板运行之进程通信专题 | 信号通信 [复制链接]

当我们在win上遇到一个没有办法正常关闭的软件的时候,我们可以打开任务管理器,强制结束这个进程,同理。在linux上也有类似的功能,比如从终端敲入ctrl+c组合键来产生一个信号,当运行中的进程捕捉到这个信号后就会做出反应。

我们在win上可以使用快捷键进入任务管理器,那么linux中会在哪些情况下会产生信号呢?

01.jpg

 

那么linux有多少种信号呢,我们可以通过命令kill命令来查看,如下图:

02.jpg

 

通过上面的截图我们可以发现,一共有64种信号,每个信号都是以sig开头,信号的名称是在signal.h中定义的。

本次文章主要涉及到三个内容,一,信号的发送,二,信号的接收,三,信号的处理。

第一部分:信号的发送

我们通过一个小例子来认识下信号的发送:

03.jpg

 

这个程序主要用到了kill函数, 因为用户空间是不具备发送信号的能力的,只有内核才可以发信号,内核有那么多信号,我们要发哪个信号,并且发给谁呢?那么我们就需要先告诉内核进程PID,信号ID是多少,kill函数就帮我们解决了这个问题,函数原型:

04.jpg

 

所以在上面的例子中,我们就可以通过kill函数来向内核发送一次产生信号的请求。

我们再来看一个和kill函数很像的函数,raise函数 ,与kill函数不同的是,它没有第一个参数,他不知道要发信号给谁,所以他只能发信号给自己。我们来看下这个例子:

05.jpg

 

编译并运行:

06.jpg

 

函数原型:

07.jpg

 

从kill和raise的函数原型上看,raise没有pid这个参数,所以raise是可以通过kill来实现的。等价于:

08.jpg

 

还有一个需要了解的函数alarm函数,与raise函数不同的是,他只能发alarm信号,并且可以定时发送信号,而raise是立刻让内核发信号。所以这个函数的参数没有pid号,也没有信号ID,只有一个延迟的秒数。需要注意的是,一个进程只能有一个alarm时间,函数原型:

09.jpg

 

第一部分信号发送总结:

用户空间不能发送信号,是通过系统调用函数告诉内核发什么信号,发给谁,让内核来发送的,只有内核才可以发信号。可以使用kill,raise,alarm函数来让内核发送信号。

第二部分信号接收

我们可以使用pause来接收信号,pause函数使该进程暂停让出CPU。我们来看下下面这个例子,当我们在键盘上按下ctrl+c的时候,程序收到SIGINT信号会被唤醒,然后执行fun函数,处理完之后再返回继续运行该程序,不按则只打印process start(进入睡眠状态)。

10.jpg

 

函数原型:

11.jpg

 

第三部分信号处理

信号的处理有三种方式,分别为:1,忽略,就是收到信号后,什么也不做,不处理。2,按照默认的方式处理。3,捕获并处理,捕获到信号后,执行我们自己想执行的代码。我们先来看下signal函数:

12.jpg

 

第一种处理方式,忽略:

我们来看下这个例子。

13.jpg

 

编译并运行,因为我们使用的参数为SIG_IGN,所以我们按下ctrl+c的时候并不能中断程序运行.

14.jpg

 

第二种处理方式,按照默认的方式处理,我们把上个例子中的参数改成SIG_DFL,如下:

15.jpg

 

编译并运行,当我们按下ctrl+c的时候,会中断我们程序。

16.jpg

 

第三种处理方式,执行我们自己的代码:

17.jpg

 

当我们按下ctrl+c的时候,会进去到fun函数。

18.jpg

 

三个部分总结:

1,我们可以使用kill命令来查看有多少个信号,在这么多信号中,我们要格外记住以下几个:

19.jpg

 

2,用户空间不能发送信号,信号的产生来自内核,让内核产生信号的方式有:通过键盘输入ctrl+c等。当程序运行出错时,内核会给进程发送一个信号,如浮点溢出等,还有就是一个程序可以通过调用函数来给另外一个进程发信号,如kill。

3,进程收到信号后,可以忽略,或者按照默认的方式处理,或者按照自己的处理函数来处理,signale是永久注册的,每次都有效,如果不想的话这样可以使用sigaction。

点赞 关注
个人签名更多开发板详情了解哦

1.https://arm-board.taobao.com
2.www.topeetboard.com
Q: 2551456065

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表