Linux信号机制

这篇博客介绍了Linux中的信号机制,包括信号的概念,如软件中断和异步事件处理。讨论了不同类型的信号,如SIGINT、SIGSEGV等,以及它们如何在特定条件下产生。还详细讲述了信号处理函数,如sigemptyset、sigprocmask、sigpending和sigaction等,以及进程如何处理和响应这些信号。
摘要由CSDN通过智能技术生成

信号概念

信号是软件中断,很多比较重要的应用程序都需要处理信号,信号提供了一种处理异步事件的方法。

每个信号都有一个名字,这些名字都以三个字符SIG开头。例如,SIGABORT是要装信号,当进程调用abort函数时产生这种信号。不存在编号为0的信号。

很多条件可以产生信号:

  • 当用户按某些终端键时,引发终端产生的信号。在终端按DELETE键(或者很多系统中的Ctrl+C键)通常产生终端信号(SIGINT)。这是停止一个已失去控制的程序的方法。
  • 硬件异常产生信号:除数为0、无效的内存引用等等。这些条件通常由硬件检测到,并将其通知内核。然后内核为该条件发生时正在运行的进程产生适当的信号。例如,对执行一个无效内存引用的进程产生SIGSEGV信号。
  • 进程调用kill(2)函数可将信号发送给另一个进程或进程组。自然,对此有所限制:接受信号进程和发送信号进程的所有者必须相同,或者发送信号进程的所有者必须是超级用户。
  • 用户可用kill(1)命令将信号发送给其他进程。此命令只是kill函数的接口。常用此命令终止一个失控的后台进程。当检测到某种软件条件已经发生,并应将其通知有关进程时也产生信号。这里指的不是硬件产生的条件(如除以0),而是软件条件。例如SIGURG(在网络连接上传来带外数据是产生)、SIGPIPE(在管道的读进程已经终止后,一个进程写此管道时产生),以及SIGALRM(进程所设置的闹钟时钟超时时产生)。
信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的。进程不能简单地测试一个变量来判别是否出现了一个信号,而必须告诉内核“在次信号出现时,请执行下列操作”。

可以要求内核在某个信号出现时按照下列三种方式之一进行处理:忽略此信号、捕获此信号和执行系统默认动作。

信号机制函数

信号集

POSIX.1定义了数据类型sigset_t以包含一个信号集,并且定义了下列五个处理信号集的函数:
  • sigemptyset(): 将信号集初始化为空
  • sigfillset(): 将信号集初始化为包含所有已定义的信号集
  • sigaddset(): 将指定信号加入到信号集中
  • sigdelset(): 将指定信号从信号集中删除
  • sigismember(): 查询指定信号是否在信号集中

sigprocmask函数

调用sigprocmask函数可以检测或更改其信号屏蔽字:

需头文件

#include <signal.h>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值