【linux应用编程】-信号

第一点

什么是信号

信号是一种内容受限的异步通信机制!(受限的意思是只能传信号,并不能传文字、图像之类的

他的目的是在于通信!(进程与进程、进程与内核)

信号是异步的(对比硬件中断)本质上是int型数字编号!

信号的来源有: 

(1)用户在终端按下按键;

(2)硬件异常后由操作系统内核发出信号;

(3)用户使用kill命令向其他进程发出信号;

(4)某种软件条件满足后也会发出信号,如alarm闹钟时间到会产生SIGALARM(sigalarm)信号、向一个读端已经关闭的管道write时会产生SIGPIPE(sigplpe)信号;

其实通俗的说,信号就是来源于硬件和软件两部分,硬件产生即通过终端按键产生的信号,比如Ctrl+C(SIGINT)软件产生即调用系统函数向进程发信号,比如kill、abort函数等

信号如何处理: 

忽略处理; SIG_IGN

捕获处理(信号绑定一个函数);

默认处理(忽略或者终止进程);SIG_DFL

常见的信号

SIGINT    2 Ctrl+C时OS送给前台进程组中每个进程(终止进程)
SIGABRT6调用abort函数,进程异常终止
SIGPOLL SIGIO 8指示一个异步IO事件,在高级IO中提及
SIGKILL9杀死进程的终极办法
SIGSEGV 11无效存储访问时OS发出该信号
SIGPIPE13涉及管道和socket
SIGALARM14涉及alarm函数的实现
SIGTERM 15kill命令发送的OS默认终止信号
SIGCHLD17子进程终止或停止时OS向其父进程发此信号
SIGUSR1 10用户自定义信号,作用和意义由应用自己定义
 

第二点

进程对信号的处理

对signal函数的解释(signal就是用来处理信号的)

这个函数有两个参数;

1.signum:更改的信号值(信号编码)

2.handler:函数指针,要更改的动作是什么

他的返回值为旧的捕获函数!!!!!

细节:
signal函数绑定一个捕获函数后信号发生后会自动执行绑定的捕获函数,并且把信号编号作为传参传给捕获函数
signal的返回值在出错时为SIG_ERR,绑定成功时返回旧的捕获函数

对SIGINT信号进行处理

第三点

alarm函数  

alarm函数是内核以API形式提供的闹钟

下面是编程实践:

对上面函数的解释:

首先我们定义一个func函数,里面进行判断打印

在主函数里,我们调用signal函数对SIGALRM信号进行判断,当有SIGALRM发生时,调用func函数进行打印!

ret得到的是alarm的返回值,他里面的数字代表三秒!

最终的执行结果:显示ret=0,然后是打印alarm happened!

上面的代码是是用sigaction这个函数代替singal这个函数!

一个进程中只有一个alarm,如果多次调用,后面的会掩盖前面的!

alarm函数的的返回值是上一次调用alarm没走完,剩的时间!

 结果:

pause函数

while(1)与 pause函数的区别:

while(1)是使CPU原地踏步的,其实CPU还在运行,这样其实很浪费资源!

pause函数是内核挂起(睡眠),交出CPU的执行权给其他进程,但是这种挂起如果有其他的信号,是会被打断的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值