Linux——进程间通信(信号与信号集)笔记

tech2023-11-25  68

文章目录

信号的概述一、信号相关的事件和状态产生信号递达未决信号的处理方式阻塞信号集(信号屏蔽字)未决信号集信号四要素信号处理默动作 二、信号发送与捕捉1.发送信号2.信号捕捉3.信号集的操作自定义集合信号屏蔽字未决信号集


信号的概述

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些事件。

它可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到该进程恢复执行再传递给它为止;如果一个信号被进程设置为阻塞,则该信号的传递被延迟,直到其阻塞被取消时才被传递给进程。

每个进程收到的信号,都是由内核负责发送的,内核处理。


一、信号相关的事件和状态

产生信号

1.按键产生,如:Ctrl+C、Ctrl+Z、Ctrl+\2.系统调用产生,如:kill、raise、abort3.软件条件产生,如:定时器alarm4.硬件异常产生,如:kill命令

递达

递达并且到达进程

未决

产生和递达之间的状态,主要由于阻塞(屏蔽)导致该状态

信号的处理方式

执行默认动作忽略捕捉(调用户处理函数)

阻塞信号集(信号屏蔽字)

将某些信号加入集合,对他们设置屏蔽,当屏蔽XX信号后,再收到该信号,该信号的处理将退后直到解除屏蔽。

未决信号集

1.信号产生,未决信号集中描述该信号的位立即翻转为1,表示信号处于未决状态。当信号被处理对应位后翻转回为0,这一时刻往往非常短暂 2.信号产生后,由于某些原因(主要是阻塞)不能递达。这类信号的集合称为未决信号集。在解除屏蔽前,信号一直处于未决状态。

信号四要素

编号名称事件默认处理动作

信号处理默动作

Term:终止进程Ign:武略信号Core:终止进程,生成Core文件Stop:停止进程Cont:继续运行进程

特别注意:9)SIGKILL 和 19)SIGSTOP信号,不允许忽略和捕捉,只能执行默认动作。设置不错将其设为阻塞

二、信号发送与捕捉

1.发送信号

发送信号的函数主要有 kill()、raise()、alarm()以及 pause()。

kill( ) 可以发送信号给进程或进程组

raise( )只允许进程向自身发送信号

alarm 也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它就向进程发送 SIGALARM 信号。

pause 函数是用于将调用进程挂起直至捕捉到信号为止。这个函数很常用,通常可以用于判断信号是否已到。


2.信号捕捉

信号处理的主要方法有两种,一种是使用简单的 signal 函数和sigaction函数,另一种是使用信号集函数组。

struct sigaction { void (*sa_handler)(int signo); //捕捉到信号后处理函数 sigset_t sa_mask; //捕捉处理函数执行期间对哪些信号进行屏蔽 int sa_flags; //默认等于0时,只对本信号进行屏蔽 void (*sa_restore)(void); }

注意:这两个函数注册信号捕捉函数,真正抓捕信号的是内核

3.信号集的操作

自定义集合

信号屏蔽字

未决信号集

sigpending函数用于读取未决信号集的状态。


最新回复(0)