linux进程通信---几个发送信号的函数(kill,raise,alarm,pause)

常见的中断信号:在这里插入图片描述
会发现一个规律,前32种信号会有各种不同的名称,后32种会以“SIGRTMIN”或者“SIGRTMAX”开头,前者是从unix继承下来的信号,称为不可靠信号(也称为非实时信号),后者为了解决“不可靠信号”的问题进行了更改和扩充的信号形成了可靠信号(也称为实时信号)

如果想要了解可靠与不可靠信号,需要了解信号的生命周期:

一个完整的信号周期可以分为三个重要阶段,三个重要阶段有四个重要事件刻画的:信号产生,信号在进程中注册,信号在进程中注销,执行信号处理函数
信号处理周期:
在这里插入图片描述

在进程中可以注册对应信号的回调:
#include <signal.h>
signal(SIGTERM, signalHandlerShutdown);
signal(SIGHUP, signalHandlerShutdown);
signal(SIGUSR1, signalHandlerShutdown);
signal(SIGQUIT, signalHandlerShutdown);
signal(SIGINT, signalHandlerShutdown);
signal(SIGKILL, signalHandlerShutdown);
signal(SIGSEGV, signalHandlerShutdown);

一但内核信号产生,就会调用回调函数signalHandlerShutdown

发送信号的函数主要有kill(),raise(),alarm(),pause()
(1)kill()和raise()
kill()函数和熟知的kill系统命令一样,可以发送信号给信号和进程组(实际上kill系统命令只是kill函数的一个用户接口),需要注意的是他不仅可以终止进程(发送SIGKILL信号),也可以向进程发送其他信号.
与kill函数不同的是raise()函数允许进程向自身发送信号。
(2)alarm()和pause():
alarm()-----也称为闹钟函数,可以在进程中设置一个定时器,等到时间到达时,就会想进程发送SIGALARM信号,注意的是一个进程只能有一个闹钟时间,如果调用alarm()之前已经设置了闹钟时间,那么任何以前的闹钟时间都会被新值所代替
pause()----此函数用于将进程挂起直到捕捉到信号为止,这个函数很常用,通常用于判断信号是否已到

下面的一个实例实现了sleep()函数的功能:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int ret = alarm(5) ;//设置一个定时器
    pause() ;//捕捉定时器信号,收到信号之前会一直阻塞
    printf("I have been waken up\n", ret) ;
}      

这个函数中的printf是不会执行的,因为定时器发送的SIGARAM的默认处理是终止程序,所以程序打印之前程序已经结束了,与sleep不同的是sleep是不会退出的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值