当前位置:网站首页>信号屏蔽与处理
信号屏蔽与处理
2022-07-28 15:28:00 【saddlesad】
信号来源与处理
有多种产生信号的方式:
- 用户在终端中按下快捷键,shell将产生信号发送至前台进程组。如Ctrl-C触发SIGINT信号,Ctrl-Z产生SIGTSTP信号,Ctrl+\产生SIGQUIT信号。
- 硬件异常产生信号,如除数为0产生SIGFPE信号,无效的内存引用产生SIGSEGV信号。
- 程序调用kill系统调用发送信号给指定进程/进程组。
- 相关软件条件发生,例如SIGURG,SIGPIPE,SIGALRM等。
进程可告知内核采取三种动作之一处理到来的信号:
忽略此信号。内核将不会通知进程此信号的产生,应用程序将无法获得与此信号有关的信息。
捕获信号。进程需要制定一个用户函数,它将在信号到来时被调用。
执行系统默认动作。有内核来决定忽略信号还是终止/停止进程。
SIGKILL和SIGSTOP不能被忽略或捕获。
屏蔽信号字
我们可以使用sigprocmask来为当前进程设置一个屏蔽信号字,那么此信号的传送将被阻塞,也就是说,如果内核为进程产生了一个被阻塞的信号,而且对该信号的动作是系统默认动作或捕获该信号,则内核将此信号保持为未决状态,直到该进程对此信号解除了阻塞,或者将对此信号的动作更改为忽略。
内核只有在递送该被阻塞的信号给进程时(而不是在产生此信号时)才决定对它的处理方式。所以进程在信号被递送前(即已经产生但因被阻塞而处于未决状态)仍可改变对该信号的动作。
如果在进程解除对某个信号的阻塞前,此信号发生了多次,那么进程也只会收到一次递送。(即信号是不排队的,不过信号排队功能将在未来被支持)。
信号屏蔽字常常用信号集来设置/获取。信号集是sigset_t类型(一般是unsigned int的typedef),可以通过位操作来设置它的内容,每一个值为1的位对应一个被屏蔽的信号类型。
#include <signal.h>
// 将信号集置空
int sigemptyset(sigset_t *set);
// 将所有信号添加到信号集中
int sigfillset(sigset_t *set);
// 添加信号signo到信号集中
int sigaddset(sigset_t *set, int signo);
// 从信号集宏删除信号signo
int sigdelset(sigset_t *set, int signo);
这4个函数的返回值:成功返回0,否则返回-1
// 判断信号集中是否有信号signo
int sigismember(const sigset_t *set, int signo);
返回值:若真返回1,否则返回0
要检测或者获取信号屏蔽字,使用sigprocmask。
#include <signal.h>
int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oset);
返回值,若成功返回0,否则返回-1
oset将被设置为进程当前的信号屏蔽字,set是将被设置的新的信号屏蔽字。
how指示如何修改:
- SIG_BLOCK:为当前的信号屏蔽字添加set中的信号(即并集)。
- SIG_UNLOCK:从当前的信号屏蔽字中删除set中的信号(即补集的交集)。
- SIG_SETMASK:直接设置当前的信号屏蔽字为set。
如果oset或set为NULL,那么将不会获取旧的信号屏蔽字或不设置新的信号屏蔽字。
如果在调用了sigprocmask后有任何未决的、当前不再阻塞的信号,则在sigprocmask返回前,内核至少将其中之一的信号递送给该进程。
要检查是否有未决的信号(产生了但被阻塞),使用sigpending。
#include <signal.h>
int sigpending(sigset_t *set);
返回值:若成功返回0,否则返回-1
set将被设置为所有当前未决的信号组成的信号集。
边栏推荐
猜你喜欢

ANSA二次开发 - 界面开发工具介绍

加速投资的小红书,“病急乱投医”?

【Multisim仿真】LM339过零电路仿真

视频号找到金钥匙,抖音模仿后来人
![[Multisim Simulation] LM339 zero crossing circuit simulation](/img/ca/f6dae5fd298c00570407c2bdfa5118.png)
[Multisim Simulation] LM339 zero crossing circuit simulation

在vs code上配置Hypermesh二次开发环境

Why do most people who learn programming go to Shenzhen and Beijing?

Kubeedge releases white paper on cloud native edge computing threat model and security protection technology

ANSYS二次开发 - MFC界面调用ADPL文件

SCI scientific paper writing Growth Camp (full version)
随机推荐
flashfxp 530 User cannot log in. ftp
Abaqus GUI界面解决中文乱码问题(插件中文乱码也适用)
使用js直传oss阿里云存储文件,解决大文件上传服务器限制
Qt学习之Qt Designer(设计师)
关于标准IO缓冲区的问题
I came across Digital Phoenix coordinate Xuhui Meiluo city in Shanghai
Curl returns blank or null without output. Solve the problem
Use py to automatically generate weekly reports based on log records
2021 Yahong pen test questions
Huada chip hc32f4a0 realizes RS485 communication DMA transceiver
Record doc
Is MySQL query limit 1000,10 as fast as limit 10? If I want to page, what should I do?
QML signal and handler event system
李宏毅《机器学习》丨4. Deep Learning(深度学习)
Rosen's QT journey 102 listmodel
软考 系统架构设计师 简明教程 | 软件调试
2021-10-21 notes
PHP image synthesis technology
为什么学编程的人大多数都去了深圳和北京?
在vs code上配置Hypermesh二次开发环境