今天小编给大家分享一下linux进程信号通信实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
创新互联公司自2013年起,是专业互联网技术服务公司,拥有项目网站设计制作、网站设计网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元四平做网站,已为上家服务,为四平各地企业和个人服务,联系电话:028-86922220
在iTOP4412开发板运行中,当我们在win上遇到一个没有办法正常关闭的软件的时候,我们可以打开任务管理器,强制结束这个进程,同理。在linux上也有类似的功能,比如从终端敲入ctrl+c组合键来产生一个信号,当运行中的进程捕捉到这个信号后就会做出反应。
我们在win上可以使用快捷键进入任务管理器,那么linux中会在哪些情况下会产生信号呢?
那么linux有多少种信号呢,我们可以通过命令kill命令来查看
我们可以发现,一共有64种信号,每个信号都是以sig开头,信号的名称是在signal.h中定义的。
第一部分:信号的发送
我们通过一个小例子来认识下信号的发送:
这个程序主要用到了kill函数, 因为用户空间是不具备发送信号的能力的,只有内核才可以发信号,内核有那么多信号,我们要发哪个信号,并且发给谁呢?那么我们就需要先告诉内核进程PID,信号ID是多少,kill函数就帮我们解决了这个问题,函数原型:
编译并运行:
从kill和raise的函数原型上看,raise没有pid这个参数,所以raise是可以通过kill来实现的。等价于:
第一部分信号发送总结:
用户空间不能发送信号,是通过系统调用函数告诉内核发什么信号,发给谁,让内核来发送的,只有内核才可以发信号。可以使用kill,raise,alarm函数来让内核发送信号。
第二部分信号接收
我们可以使用pause来接收信号,pause函数使该进程暂停让出CPU。我们来看下下面这个例子,当我们在键盘上按下ctrl+c的时候,程序收到SIGINT信号会被唤醒,然后执行fun函数,处理完之后再返回继续运行该程序,不按则只打印process start(进入睡眠状态)。
第三部分信号处理
信号的处理有三种方式,分别为:1,忽略,就是收到信号后,什么也不做,不处理。2,按照默认的方式处理。3,捕获并处理,捕获到信号后,执行我们自己想执行的代码。我们先来看下signal函数:
编译并运行,因为我们使用的参数为SIG_IGN,所以我们按下ctrl+c的时候并不能中断程序运行.
编译并运行,当我们按下ctrl+c的时候,会中断我们程序。
当我们按下ctrl+c的时候,会进去到fun函数。
2,用户空间不能发送信号,信号的产生来自内核,让内核产生信号的方式有:通过键盘输入ctrl+c等。当程序运行出错时,内核会给进程发送一个信号,如浮点溢出等,还有就是一个程序可以通过调用函数来给另外一个进程发信号,如kill。
3,进程收到信号后,可以忽略,或者按照默认的方式处理,或者按照自己的处理函数来处理,signale是永久注册的,每次都有效,如果不想的话这样可以使用sigaction。
以上就是“linux进程信号通信实例分析”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注创新互联行业资讯频道。