【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 等待信号
来源:互联网 发布:估值建模 知乎 编辑:程序博客网 时间:2024/06/09 13:47
【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 等待信号
进程可以因等待某些特定的信号而阻塞、pause()函数用来等待除当前进程屏蔽信号集外的任意信号。
而sigsuspend()函数用来等待指定信号(由其参数指定,不受当前进程信号屏蔽集合的影响)以外的任意信号。
当收到某个信号后,进程屏蔽的信号将自动恢复到原来屏蔽的信号集合。
应用示例:
//test for sigsuspend#include<signal.h>#include<stdlib.h>#include<errno.h>#include<stdio.h>void pr_mask(char *str){sigset_t sigset01;int errno_save;errno_save=errno;if(sigprocmask(0,NULL,&sigset01)<0) perror("sigprocmask erro!");printf("%s\n",str);if(sigismember(&sigset01,SIGINT)) printf("SIGINT\n");if(sigismember(&sigset01,SIGQUIT)) printf("SIGQUIT\n");if(sigismember(&sigset01,SIGUSR1)) printf("SIGUSR1\n");if(sigismember(&sigset01,SIGALRM)) printf("SIGALRM\n");errno=errno_save;}static void sig_int(int signo){printf("signo=%d\n",signo);pr_mask("\ntest :in sig_int\n");}int main(void){sigset_t newmask,oldmask,waitmask;pr_mask("program start:");if(signal(SIGINT,sig_int)==SIG_ERR) perror("signal(SIGINT) error!!\n");if(signal(SIGUSR1,sig_int)==SIG_ERR)perror("signal(SIGUSR1) error");sigemptyset(&waitmask);sigaddset(&waitmask,SIGUSR1);sigemptyset(&newmask);sigaddset(&newmask,SIGINT);if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)<0) perror("SIG_BLOCK erro!!\n");pr_mask("in critical region:");if(sigsuspend(&waitmask)!=-1) perror("sigsuspend erro!!\n"); pr_mask("after return from sigsuspend:");if(sigprocmask(SIG_SETMASK,&oldmask,NULL)<0) perror("SIG-SETMASK erro!!\n");while(1);pr_mask("\nprogram exit:\n");exit(0);}运行结果:
终端1:
$ ./sigsuspend_test &[3] 3349program start:in critical region:SIGINT
终端2:
$ kill -SIGUSR1 3349kill -SIGINT 3349终端1:
signo=2test :in sig_intSIGINTSIGUSR1signo=10test :in sig_intSIGINTSIGUSR1after return from sigsuspend:SIGINT
终端2:
$ kill -SIGUSR2 3349终端1:
[3]+ 用户定义信号 2 ./sigsuspend_test
原文链接:http://blog.csdn.net/geng823/article/details/40948079
0 0
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 等待信号
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 安装信号与捕捉信号
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号集与屏蔽信号
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - Linux常见信号及处理
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号应用实例
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 孤儿进程和僵死进程
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 进程资源及属性
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 回收进程用户/内核资源
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 守护进程
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - System V进程间通信基础
- 【原创】《Linux高级程序设计》杨宗德著- 进程管理与程序开发 - fork和vfork函数
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - exec和system函数
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 管道
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 信号量通信机制
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 共享内存
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - System V进程间通信之消息队列
- 【原创】《Linux高级程序设计》(杨宗德著)--- Linux进程存储管理
- 【原创】《Linux高级程序设计》杨宗德著 - Linux多线程编程 - 多线程异步管理 - 信号
- IT 成长之路
- FMDB 简化 SQLite
- Android 异步加载网络图片并缓存到本地 软引用 学习分享
- Move all zeroes to end of array
- spring学习6-注解配置
- 【原创】《Linux高级程序设计》杨宗德著 - 进程管理与程序开发 - 等待信号
- 推荐!国外程序员整理的机器学习资源大全
- git进行版本控制
- C++学习建议
- 用循环队列实现打印杨辉三角(数据结构)
- java自学之路-----XML_解析技术
- 机器学习的最佳入门学习资源
- 程序员的自我修养----软件工程思想
- 《高性能MYSQL》学习(一)