Advertisement

【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 信号, 在捕获回调函数中完成对相关子进程中止执行的状态清除.

全部评论 (0)

还没有任何评论哟~