屏蔽信号的多路选择I/O
前边提到了多路I/O的方法,这一章屏蔽信号的多路选择与之前的多路I/O一致,只是增加了屏蔽信号的作用。多路选择I/O中我们使用的是select函数,屏蔽信号的多路选择I/O使用的是pselect函数,与之前的函数相比,增加了一个参数可以用来屏蔽信号。具体函数如下所示:
int pselect(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timespec *timeout, const sigset_t *sigmask);
头文件: #include <sys/select.h>
参数说明:前4个参数与select函数的参数相同,分别表示最大的文件描述符和关心的文件中状态。
第5个参数表示等待时间,所不同的是timespec结构所能表示的最小精度是纳秒,旧的结构体中所能表示的最小精度是微妙数。
pselect函数最后一个参数可以用来屏蔽信号,在pselect函数返回后,再将屏蔽的信号恢复,并且所有的操作都是原子的。
返回值:超时返回0,出错返回-1,成功返回描述字的个数。
下面用两个程序的对比来说明select函数与pselect函数的区别。
第一个程序使用select函数,程序中人为的制造了一个造成函数阻塞的条件。该程序在阻塞的时候会被信号中断。
#include <stdio.h>
#include <sys/select.h>
#include <stdlib.h>
#include <signal.h>
/* SIGUSR1的信号处理函数 */
void sigusr1_handler(int signo)
{
printf("catch SIGUSR1\n"); /* 接收SIGUSR1信号,打印接收信息 */
}
int main()
{
int rdy; /* 准备好的设备数 */
/* 注册信号处理函数,如果捕捉到信号则输出提示信息 */
if(signal(SIGUSR1, sigusr1_handler) == SIG_ERR){
perror("can’t set handler for SIGUSR1");
exit();
}
/* 不关心所有的设备准备状态,所以检查设备的最大文件描述符的值也不再有意义。
* 等待时间结构为NULL,表示将等待时间设置为无限等待
*/
rdy = select(, NULL, NULL, NULL, NULL);
/* 因为是无限等待,所以绝对不应该执行到这里,输出提示信息 */
printf("should never be here\n");
return ;
}
第二个程序使用pselect函数,程序中人为的制造了一个造成函数阻塞的条件。该程序在阻塞的时候不会被信号中断。
#include <stdio.h>
#include <sys/select.h>
#include <stdlib.h>
#include <signal.h>
/* SIGUSR1的信号处理函数 */
void sigusr1_handler(int signo)
{
printf("catch SIGUSR1\n"); /* 接收SIGUSR1信号,打印接收信息 */
}
int main()
{
int rdy; /* 准备好的设备数 */
sigset_t set; /* 信号集 */
/* 注册信号处理函数,如果捕捉到信号则输出提示信息 */
if(signal(SIGUSR1, sigusr1_handler) == SIG_ERR){
perror("can’t set handler for SIGUSR1");
exit();
}
sigfillset(&set); /* 设置信号集,屏蔽所有的信号,包括SIGKILL和SIGSTOP */
/* 不关心所有的设备准备状态,所以检查设备的最大文件描述符的值也不再有意义。
* 等待时间结构为NULL,表示将等待时间设置为无限等待
*/
rdy = pselect(, NULL, NULL, NULL, NULL, &set);
/* 因为是无限等待,所以绝对不应该执行到这里,输出提示信息 */
printf("should never be here\n");
return ;
}
在调试的时候用kill命令向进程发送SIGUSR1信号,观察输出结果,通过两个程序运行的对比可以清楚的理解pselect函数和select函数的区别。
屏蔽信号的多路选择I/O的更多相关文章
- Linux c 屏蔽信号、切换信号
信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1. 信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...
- 多路选择I/O
多路选择I/O提供另一种处理I/O的方法,相比于传统的I/O方法,这种方法更好,更具有效率.多路选择是一种充分利用系统时间的典型. 1.多路选择I/O的概念 当用户需要从网络设备上读数据时,会发生的读 ...
- golang开发:select多路选择
select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,s ...
- SM30维护视图屏蔽按钮与增加选择条件
*---------------------------------------------------------------------- * TABLES/Structure *-------- ...
- Simulink仿真入门到精通(二) Simulink模块
2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...
- 信号屏蔽的切换的理解sigsuspend
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h&g ...
- 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数
34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...
- linux 信号屏蔽
<span style="font-size:18px;">#include <sys/types.h> #include <unistd.h> ...
- Linux学习笔记(10)-信号
所谓信号(singal),在我的理解来说,其实和单片机开发中的中断差不多,但是它并非是由系统硬件所提供的,而是软件操作系统的支持的一种提醒机制. 收到信号之后的处理方法,一般由三种: (1)第一种是类 ...
随机推荐
- STL 源代码剖析 算法 stl_algo.h -- inplace_merge
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie inplace_merge(应用于有序区间) ----------------------- ...
- 应用开发之WinForm开发
本章简言 上一章笔者介绍了关于WinForm环境.这一章笔者将继续讲WinForm.只不过更加的面向开发了.事实就是在学习工具箱里面的控件.对于WinForm开发来讲,企业对他的要求并没有那么高.但是 ...
- 数据库为什么要用B+树结构--MySQL索引结构的实现(转)
B+树在数据库中的应用 { 为什么使用B+树?言简意赅,就是因为: 1.文件很大,不可能全部存储在内存中,故要存储到磁盘上 2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/ ...
- java基础---->string字面量的使用
这里简单的理解一下java中关于string字面量的知识,关于字节码可以使用java自带的javap工具查看. string字面量 一.直接贴出测试的代码 A string literal alway ...
- oracle的后台进程能否杀掉
oracle的后台进程杀掉会有什么影响 说明:本文复制自网友的博客: https://blog.csdn.net/kellyseeme/article/details/8927757 数据库版本为: ...
- Zabbix监控web,MySQL,TCP状态,Nginx
接上篇Zabbix使用SMTP发送邮件报警并且制定报警内容 Zabbix怎么设置声音告警 web监控 在zabbix server选择web 创建一个监控web的场景 添加后这里有数字1 查看 假如在 ...
- Code Forces 644A Parliament of Berland
A. Parliament of Berland time limit per test1 second memory limit per test256 megabytes inputstandar ...
- 第九课——redis集群
第九课时作业 静哥 by 2016.4.18~2016.4.25 1.节点 (1)节点概念:一个节点就是redis集群里的一台redis服务器.一个redis集群是由多个节点(node)组成,最初每个 ...
- wampserver环境搭建
一.进入wampserver官网下载:http://www.wampserver.com/ 下载对应电脑相应版本的wamp程序(比如电脑是64位系统的就下载对应的64位的) 二.安装(直接点击exe文 ...
- Spark Standalone Mode 单机启动Spark -- 分布式计算系统spark学习(一)
spark是个啥? Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发. Spark和Hadoop有什么不同呢? Spark是基于map reduce算法实现的分布式计算,拥 ...