【linux】信号集操作函数 信号捕捉
信号集设定
信号处理控制原理框图
核心通过获取未决信号集来决定是否处理该信号。屏蔽位mask能够影响未决信号集的状态。从而,在应用程序中自定义集合以调整mask值,并实现对特定信号的屏蔽。
信号操作的几个函数所代表的意义及用法
sigemptyset是一个初始化set所指向的信号集,使得其中所有信号的对应位被清零 ,从而表明该信号集不含任何有效信号。
int sigemptyset(sigset_t *set);
sigfillset用于设置所指信号集的bit位状态,并将其中所有对应bit置位以表明该信号集仅包含系统支持的所有信号。
int sigfillset(sigset_t *set);
3.sigaddset把某个特定信号加入到set
int sigaddset(sigset_t *set, int signum;
4.把某个信号从set中移除
int sigdelset(sigset_t *set, int signum);
5.signismember 是为了判断某个信号是否在该set中。
int sigismember(const sigset_t *set,int signum);
该函数的主要作用是配置进程的信号屏蔽机制,并提供对信号屏蔽状态的控制能力(包括启用与禁用)。它通过操作进程中的信号屏蔽字(PCB)来实现相关功能。
特别关注并阻断信号:仅会推迟执行(直至解除了禁令),而不会丢弃
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
返回值:
成功: 0;
失败: -1,设置errno
参数1 how:SIG_BLOCK(设置阻塞),SIG_UNBLOCK(取塞),SIG_SETMASK(自定义set)
set:自定义set
oldset:旧有的mask
7.sigpending函数:读取当前进程的未决信号集
返回值:
成功返回值为0:
失败返回值为-1,并设置errno。
参数为set传出未决信号集。
2.信号捕捉
signal和sigaction函数仅负责对信号进行注册这一任务,并非拥有其他额外功能。而针对信号捕获的处理,则完全依赖于内核系统来完成。当一个信号被成功注册后,在随后的过程中, 内核会立即调用与该信号注册相关的应用程序响应函数
1.signal函数 : 注册一个信号捕捉函数:
define sighandler_t (int) (* signal handler)
>
此函数由ANSI标准定义。受历史背景影响,在不同Unix系统版本和Linux系统版本之间可能存在行为差异。因此最好尽量避免使用该函数,并替代地采用sigaction函数更为合适。
2.sigaction函数:增加新的行为处理机制(通常用于在Linux系统中注册用于捕获特定信号的行为)
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
返回值:
成功: 1
失败: -1,设置errno
参数
act:传入参数,新的处理方式。。
oldact:传出参數,旧的处理方式。
struct sigaction {
void (*sa_handler) (int);
void (*sa_sigaction) (int, const struct siginfo_t *, void *);
uint64_t sa_mask;
int32_t sa_flags;
void (*sa_restorer)();
}
重点掌握
sa_handler : 指定信号捕捉后所对应的处理函数名称(即注册函数)。同样地, 也可以将其赋值为 SIG_IGN 或者 SIG_DFL, 分别表示在捕获该信号时会忽略事件或执行默认行为。
sa_mask表示在运行信号处理函数时所需屏蔽的信号集合(称为信号屏蔽子)。意思是,在处理函数被调用期间生效,并且属于临时性设置。
sa_flags : 一般情况下设定为 0 。其中用于在函数运行过程中捕获事件,并阻止在同一时间段内再次捕获同一个信号。
3.SIGCHLD信号
1.产生的条件
子进程终止时
子进程接收到SIGSTOP信号停止时
子进程处在停止态,接受到SIGONT后唤醒时
2.借助SIGCHLD信号回收子进程
子进程中止执行后, 父进程中接收到 SIGCHLD 信号. 其默认处理行为为被忽略. 程序可以通过捕获该 SIGCHLD 信号, 在捕获回调函数中完成对相关子进程中止执行的状态清除.
