前边提到了多路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. 仿美团ViewPager+GridView

    在接下来我要实现一个仿美团的效果 1.首先写一个登录注册界面用到了,很简单... 这里要提醒各位在调用方法时有set...     也有add....  的方法,为了严谨可以做些正则判断手机号,用se ...

  2. AMD、CMD、CommonJs和 ES6对比

    AMD(异步模块定义)是RequireJS在推广过程中对模块定义的规范化产出. define(['package/lib'], function(lib){ function foo(){ lib.l ...

  3. Zabbix添加web页面监控告警

    一,选择添加了web监控的主机 二,创建一个告警触发器 三,定义监控项 设置完毕假如网站down就会触发告警 怎么设置web监控以及触发告警action参考 Zabbix使用SMTP发送邮件报警并且制 ...

  4. oracle导入导出 dmp文件

    oracle导入导出 dmp文件: 打开cmd窗口,在cmd窗口下,按照个人需要输入以下对应的命令: 1.imp 用户名/密码@网络服务名 file=XXX.dmp fromuser=XXX tous ...

  5. kibana5.6源码分析2

    1.启动shell脚本:/bin/kibana;   js脚本:/src/cli/cli.js; 2.服务端入口:/src/server/kbn_server.js.使用的web框架为hapi.js. ...

  6. local unversioned, incoming add upon update问题

    当update的时候遇到如下问题 svn status D C ~/workspace/test/a.c > local unversioned, incoming add upon updat ...

  7. Every write operation executed on a document, deletes included

    Delete API | Elasticsearch Reference [6.5] | Elastic https://www.elastic.co/guide/en/elasticsearch/r ...

  8. Centos locate 文件搜索命令(十一)

    locate命令 locate 文件名 在后台数据库中按文件名搜索,搜索速度更快 /var/lib/mlocate #locate命令所搜索的后台数据库 updatedb 更新数据库 locate搜索 ...

  9. Python 之网络编程

    # 流程描述: # # 1. 服务器根据地址类型(ipv4, ipv6), socket类型, 协议创建socket; # # 2. 服务器为socket绑定ip地址和端口号; # # 3. 服务器s ...

  10. JAVA—List集合总结

    List接口总结: List接口是Collection接口的子接口,从其名称可以看出,是一个元素有序(并不是按大小排序,具有顺序索引,类似于数组),默认按照元素的添加顺序设置元素的索引,List和Se ...