本文共 1815 字,大约阅读时间需要 6 分钟。
#includeint sigprocmask(int how, const sigset_t *set, sigset_t *oset);
参数 how 的取值如下:
名称 | 说明 |
---|---|
SIG_BLOCK | 把参数 set 中的信号添加到信号屏蔽字中 |
SIG_SETMASK | 把信号屏蔽字设置为参数 set 中的信号 |
SIG_UNBLOCK | 从信号屏蔽字中删除参数 set 中的信号 |
#includeint sigemptyset(sigset_t *set); // 初始化信号集为空int sigaddset(sigset_t *set, int signo); // 向信号集中添加信号int sigfillset(sigset_t *set); // 初始化信号集为包含所有已定义的信号int sigdelset(sigset_t *set, int signo); // 删除给定的信号int sigismember(sigset_t *set, int signo); // 判断给定信号是否一个信号集的成员。返回值 1:是,0:不是,-1:信号无效
#include#include #include void handleSig(int);void main(){ signal(SIGINT, handleSig); signal(SIGALRM, handleSig); int res; sigset_t set; sigset_t oset; sigemptyset(&set); sigemptyset(&oset); sigaddset(&set, SIGINT); // 添加 SIGINT 信号到信号集 sigaddset(&set, SIGALRM); res = sigprocmask(SIG_SETMASK, &set, &oset); // 设置进程信号屏蔽字为 set 信号集 while(1){ printf("alive.\n"); sleep(2); }}void handleSig(int sig){ switch(sig){ case SIGINT: // printf("got sigint\n"); sleep(10); printf("got sigint. done.\n"); break; case SIGALRM: // printf("got sigalrm\n"); sleep(10); printf("got sigalrm. done.\n"); break; }}
执行程序,运行结果如下(多次尝试 中断 该进程,进程都没有任何响应):
ubuntu@cuname:~/dev/beginning-linux-programming/test$ gcc -o test6 test6.cubuntu@cuname:~/dev/beginning-linux-programming/test$ ./test6alive.alive.^C^C^C^Calive.^C^C^C^C^C^C^C^C^C^C^C^Calive.^C^C^C^C^C^C^C^C^C^C^Calive.^C^C^C^C^C^C^C^C^Calive.^Calive.alive.alive.Killed
转载地址:http://tclsi.baihongyu.com/