前边提到了多路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的更多相关文章

  1. Linux c 屏蔽信号、切换信号

    信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1.      信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...

  2. 多路选择I/O

    多路选择I/O提供另一种处理I/O的方法,相比于传统的I/O方法,这种方法更好,更具有效率.多路选择是一种充分利用系统时间的典型. 1.多路选择I/O的概念 当用户需要从网络设备上读数据时,会发生的读 ...

  3. golang开发:select多路选择

    select 是 Golang 中的一个控制结构,语法上类似于switch 语句,只不过select是用于 goroutine 间通信的 ,每个 case 必须是一个通信操作,要么是发送要么是接收,s ...

  4. SM30维护视图屏蔽按钮与增加选择条件

    *---------------------------------------------------------------------- * TABLES/Structure *-------- ...

  5. Simulink仿真入门到精通(二) Simulink模块

    2.1 Simulink模块的组成要素 用户构建系统模型时无需直接面对成千上万行的代码,而是通过模块化图形界面以模块化的方式构建,能够使理解变得容易,让大脑减负.通过层次化模块分布将系统功能模块化,而 ...

  6. 信号屏蔽的切换的理解sigsuspend

    #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h&g ...

  7. 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数

    34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...

  8. linux 信号屏蔽

    <span style="font-size:18px;">#include <sys/types.h> #include <unistd.h> ...

  9. Linux学习笔记(10)-信号

    所谓信号(singal),在我的理解来说,其实和单片机开发中的中断差不多,但是它并非是由系统硬件所提供的,而是软件操作系统的支持的一种提醒机制. 收到信号之后的处理方法,一般由三种: (1)第一种是类 ...

随机推荐

  1. UIScrollView小记

    视图的滚动过程,其实是在不断修改原点坐标.当手指触摸后,ScrollView会暂时拦截触摸事件,使用一个计时器.假如在计时器到点后没有发生手指移动事件,那么ScrollView发送tracking e ...

  2. JDBC通用DAO

    dbcBaseDao接口,内容如下: package com.sun4j.core.jdbc.dao; import java.io.Serializable; import java.util.Li ...

  3. JS内存泄漏排查方法-Chrome Profiles

    原文链接:http://caibaojian.com/chrome-profiles.html 一.概述 Google Chrome浏览器提供了非常强大的JS调试工具,Heap Profiling便是 ...

  4. tomcat https 证书生成与配置

    第一步:生成证书 命令行输入: keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore &quo ...

  5. Maven结构下 properties 读取

    Properties properties = new Properties();InputStream in = ClassLoader.class.getResourceAsStream(&quo ...

  6. Hibernate的时间戳缓存区域

    时间戳:一个详细到秒的时间点,就是一个时分秒的字符串 时间戳缓存区域存放了对于查询结果相关的表进行插入, 更新或删除操作的时间戳. Hibernate 通过时间戳缓存区域来判断被缓存的查询结果是否过期 ...

  7. KVM虚拟机克隆及快照管理

    一,克隆 查看虚拟机硬盘位置(其中centos1为虚拟机名称) virsh edit centos1 克隆(centos1为需要克隆的虚拟机名称centos2为克隆后的虚拟机名称CentOS2.qco ...

  8. [linux基础学习]默认的目录介绍

    以下用一个表格来罗列linux默认的目录或文件及其用途: 目录/文件 用途 来源 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录.文件.设备都在/之下. - / ...

  9. 零基础在Linux服务器上部署javaweb项目

    本教程使用的工具下载链接:http://pan.baidu.com/s/1sl1qz2P 密码:43pj 一.安装JDK 1.首先要查看服务器的系统版本,是32位还是64位 #getconf LONG ...

  10. IE8数组不支持indexOf方法的解决办法

    在使用indexof方法之前加上以下代码就可以了. if (!Array.prototype.indexOf){           Array.prototype.indexOf = functio ...