sigaddset,sigprocmask, sigpending ...
2015-03-14 14:08
459 查看
#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
示例代码如下:
测试结果:
sleeping 0
^Csleeping 1
sleeping 2
sleeping 3
sleeping 4
SIGINT is blocked 1
recover signal
catch SIGINT | signum = 2
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
示例代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <signal.h> #include <unistd.h> void sigfunc(int signum); int main() { sigset_t newsigset, oldsigset, pendsigset; //1-设置捕获信号 signal(SIGINT, sigfunc); //2-初始化信号集 sigemptyset(&newsigset); //3-添加待处理信号集 sigaddset(&newsigset, SIGINT); //4-设置阻塞信号集 sigprocmask(SIG_BLOCK, &newsigset, &oldsigset); //5-休眠 for (int i=0; i<5; ++i) { printf("sleeping %d\n", i); sleep(1); } //6-检查获取到的被阻塞的信号集 sigpending(&pendsigset); printf("SIGINT is blocked %d\n", sigismember(&pendsigset, SIGINT)); //7-还原被屏蔽的信号集 printf("recover signal \n"); sigprocmask(SIG_SETMASK, &oldsigset, 0); return 0; } void sigfunc(int signum) { printf("catch SIGINT | signum = %d\n", signum); }
测试结果:
sleeping 0
^Csleeping 1
sleeping 2
sleeping 3
sleeping 4
SIGINT is blocked 1
recover signal
catch SIGINT | signum = 2
相关文章推荐
- sigprocmask , sigpending 和 sigsuspend函数
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset、sigaddset、sigprocmask的用法 信号未决,信号阻塞 信号的捕捉
- 嵌入式 sigemptyset、sigaddset、sigprocmask的用法示例
- 信号:signal(), sigaction(), sigaddset(), sigemptyset(), sigismember(), sigprocmask()
- linux学习---信号(signal,sigaction,kill,sigqueue,sigprocmask,sigpending,sigsuspend)
- Linux信号控制-sigprocmask,sigsuspend,sigpending,sigaction,sigqueue
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset、sigaddset、sigprocmask的用法
- sigprocmask, sigpending, sigsuspend的用法
- C语言学习:信号屏蔽字sigset_t,sigprocmask,sigpending
- linux信号(sigprocmask,sigpending)
- sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask,sigpendmask作用
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset、sigaddset、sigprocmask的用法
- sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask
- sigemptyset、sigaddset、sigprocmask的用法
- Linux进程间通信(二):信号集函数 sigemptyset()、sigprocmask()、sigpending()、sigsuspend()