sigaddset,sigprocmask, sigpending ...

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

int sigemptyset(sigset_t *set);                              

int sigfillset(sigset_t *set);

int sigaddset(sigset_t *set, int signum);

int sigdelset(sigset_t *set, int signum);

int sigismember(const sigset_t *set, int signum);

int sigpending(sigset_t *set);

 

上面几个函数都可以鉴名思意,下面就简单介绍一下用法,帮助快速理解和记忆

这几个函数组合起来一般是用来延迟信号处理,即进程收到指定信号时不立即处理信号事件,而是待调用sigpending时再处理

使用流程一般为:

1、设置信号处理方法        signal

2、初始化待设置信号集     sigemptyset(全部清0) 或 sigfillset(全部置1)

3、添加待设置信号集        sigaddset

4、设置信号屏蔽              sigprocmask

5、进程休眠或处理其他事件

6、查看捕获到的被延迟的信号    sigpending

7、还原初始信号集           sigprocmask

 

示例代码如下:

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <signal.h>
 5 #include <unistd.h>
 6 void sigfunc(int signum);
 7 int main()
 8 {
 9     sigset_t newsigset, oldsigset, pendsigset;
10     //1-设置捕获信号
11     signal(SIGINT, sigfunc);
12     //2-初始化信号集
13     sigemptyset(&newsigset);
14     //3-添加待处理信号集
15     sigaddset(&newsigset, SIGINT);
16     //4-设置阻塞信号集
17     sigprocmask(SIG_BLOCK, &newsigset, &oldsigset);
18     //5-休眠
19     for (int i=0; i<5; ++i)
20     {
21         printf("sleeping %d\n", i);
22         sleep(1);
23     }
24     //6-检查获取到的被阻塞的信号集
25     sigpending(&pendsigset);
26     printf("SIGINT is blocked %d\n", sigismember(&pendsigset, SIGINT));
27     //7-还原被屏蔽的信号集
28     printf("recover signal \n");
29     sigprocmask(SIG_SETMASK, &oldsigset, 0);
30     return 0;
31 }
32 
33 void sigfunc(int signum)
34 {
35     printf("catch SIGINT | signum = %d\n", signum);
36 }

 

 测试结果:

sleeping 0
^Csleeping 1
sleeping 2
sleeping 3
sleeping 4
SIGINT is blocked 1
recover signal
catch SIGINT | signum = 2

转载于:https://www.cnblogs.com/netos/p/4337299.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`sigprocmask` 函数是一个系统调用,用于设置进程的信号屏蔽字,用于控制信号的传递。该函数有三个参数:`how` 表示如何修改信号屏蔽字,`set` 表示新的信号屏蔽字,`oldset` 表示旧的信号屏蔽字。 `how` 参数可以取以下三个值: - `SIG_BLOCK`:将 `set` 中的信号添加到当前进程的信号屏蔽字中。 - `SIG_UNBLOCK`:将 `set` 中的信号从当前进程的信号屏蔽字中移除。 - `SIG_SETMASK`:将当前进程的信号屏蔽字替换为 `set` 中的信号屏蔽字。 `set` 参数是一个指向 `sigset_t` 类型的指针,表示新的信号屏蔽字。`sigset_t` 是一个用于存储信号集合的类型,可以使用 `sigemptyset`、`sigfillset`、`sigaddset`、`sigdelset` 等函数来进行初始化和操作。 `oldset` 参数是一个指向 `sigset_t` 类型的指针,表示旧的信号屏蔽字。如果该参数不为 `NULL`,则 `sigprocmask` 函数会将当前进程的信号屏蔽字存储到 `oldset` 指向的内存中。 以下是一个示例代码,演示了如何使用 `sigprocmask` 函数设置信号屏蔽字: ```c #include <stdio.h> #include <signal.h> int main() { sigset_t set, oldset; sigemptyset(&set); sigaddset(&set, SIGINT); sigprocmask(SIG_BLOCK, &set, &oldset); printf("signal mask has been set to block SIGINT\n"); // do something sigprocmask(SIG_SETMASK, &oldset, NULL); printf("signal mask has been restored\n"); return 0; } ``` 在上面的示例中,我们首先使用 `sigemptyset` 和 `sigaddset` 函数初始化 `set`,将 `SIGINT` 信号添加到信号集合中。然后使用 `sigprocmask` 函数将 `SIGINT` 信号添加到当前进程的信号屏蔽字中,从而屏蔽该信号。在处理完需要屏蔽信号的任务后,我们使用 `sigprocmask` 函数将信号屏蔽字恢复为原始状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值