6.11 通过文件描述符来获取信号
6.11 通过文件描述符来获取信号
从内核2.6.22版本开始,Linux提供了另外一种机制来接收信号:通过文件描述符来获取信号即signalfd机制。
这个机制和sigwaitinfo非常地类似,都属于同步等待信号的范畴,都需要首先调用sigprocmask将关注的信号屏蔽,以防止被信号处理函数劫走。
不同之处在于,文件描述符方法提供了文件系统的接口,可以通过select、poll和epoll来监控这些文件描述符。
signalfd接口的定义如下:
int signalfd(int fd, const sigset_t *mask, int flags);
其中,mask参数是信号集,表示关注信号的集合。
这些信号的集合应该在调用signalfd函数之前,先调用sigprocmask函数阻塞这些信号,以防止被信号处理函数劫走。
首次创建时fd参数应该为-1,该函数会创建一个文件描述符,用于读取mask中到来的信号。
如果fd不是-1,则表示是修改操作,一般是修改mask的值,此时fd是之前调用signalfd时返回的值。
第三个参数flags用来控制行为,目前支持的标志位如下。
- SFD_CLOEXEC:和普通文件的O_CLOEXEC一样,调用exec函数时,文件描述符会被关闭。
- SFD_NONBLOCK:控制将来的读取操作,如果执行read操作时,并没有信号到来,则立刻返回失败,并设置errno为EAGAIN。
创建文件描述符后,可以使用read函数来读取到来的信号。
提供的缓冲区大小一般要足以放下一个signalfd_siginfo结构体,该结构体一般包括如下成员变量:
struct signalfd_siginfo { uint32_t ssi_signo; int32_t ssi_errno; int32_t ssi_code; uint32_t ssi_pid; uint32_t ssi_uid; int32_t ssi_fd; uint32_t ssi_tid; uint32_t ssi_band; uint32_t ssi_overrun; uint32_t ssi_trapno; int32_t ssi_status; int32_t ssi_int; uint64_t ssi_ptr; uint64_t ssi_utime; uint64_t ssi_stime; uint64_t ssi_addr; uint8_t pad[X];
};
这个结构体和前面提到的siginfo_t结构体几乎可以一一对应。
含义和siginfo_t中的成员也一样,在此就不再赘述了。
使用signalfd来接收信号的方法如下(此处忽略了一些异常处理):
sigprocmask(SIG_BLOCK,&mask,NULL);
sfd = signalfd(-1,&mask,NULL);
for(;;)
{ n = read(sfd,&fd_siginfo,sizeof(struct signalfd_siginfo)); if(n != sizeof(struct signalfd_siginfo)){ /*error handle*/} else{ /*process the signal*/}
}
比较推荐的做法是用文件描述符signalfd和sigwaitinfo两种方法来处理信号,使用传统信号处理函数会因为异步带来很多问题,大量的函数因不是异步信号安全的,而无法用于信号处理函数。
本节介绍的signalfd方法更加值得推荐,因为方法简单,且可以和select、poll和epoll函数配合使用,非常灵活。
6.11 通过文件描述符来获取信号相关推荐
- 网络编程(part5)--文件读写偏移量及文件描述符
鄙人学习笔记 文章目录 文件读写偏移量(文件指针) 定义 举个例子1(读写操作的文件偏移量) 举个例子2(文件偏移量的初始位置验证) 基本操作 举个例子1(tell()函数) 举个例子2(tell() ...
- linux存储--文件描述符以及file结构体(一)
一.什么是文件描述符 在Linux下一切皆文件,对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符.当读. ...
- 文件描述符fd是什么?
文章目录 文件描述符 提出前提 简介 如何创建文件描述符 20220411 文件描述符扩展 文件描述符 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负 ...
- linux文件描述符 0 1 2,文件描述符
内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件 ...
- Linux:如何获取打开文件和文件描述符数量
一.linux的文件描述符 文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符.文件描述符是一 ...
- linux 内核 遍历文件夹,Linux内核中通过文件描述符获取绝对路径
背景 在Linux内核中,已知一个进程的pid和其打开文件的文件描述符fd,如何获取该文件的绝对路径?基本思路是先获取该文件在内核中的file结构体,再通过d_path()获取到整个文件的绝对路径. ...
- Linux系统学习笔记:文件描述符标志
文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...
- linux c中的文件描述符与打开文件之间的关系
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通 ...
- Linux中通过Socket文件描述符寻找连接状态介绍
针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...
最新文章
- 清华大学张悠慧:超越冯·诺依曼模型,实现软硬件去耦合的类脑计算(附视频)
- maven中pom.xml中依赖包代码的查询地址
- POJ 3469 Dual Core CPU (最小割建模)
- klib库下的kroundup32(二进制的四舍五入)算法
- 某站点下载资源自己主动评论器
- 20应用统计考研复试要点(part40)--概率论与数理统计
- leetcode-187-重复的DNA序列
- 各层作用_终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的
- 自动生成mybatisplus的相关代码
- 基于React的可编辑在线简历模板
- Java书店管理系统
- 新会计准则 计算机管理系统,用友ERP供应链管理系统实验教程(新会计准则版)pdf...
- yum 装包时,提示Peer cert cannot be verified or peer cert invalid
- 计算机控制技术俞光昀练习答案,计算机控制技术 复习重点 ( 俞光昀)
- git如何安装aur_Linux┊一个好用的AUR工具yaourt | 简单.生活
- intval的绕过和chr的利用
- Excel自定义格式参数
- 天玑1300和骁龙778plus哪个好
- 《JavaEE初阶》HTTP协议和HTTPS
- 如何用Excel画出漂亮的图(office 2016)
热门文章
- 一台电脑同时安装IE6、IE7、IE8三种浏览器
- 实现IE6、IE7、IE8多版本浏览器共存
- 人,羊,狼,菜过河问题的计算机编程实现的matlab程序,人狼羊菜渡河问题(含Matlab程序)...
- 【PPT】绘制表格和多样式圆圈
- java实现手机短信发送的功能详细代码
- 冯诺依曼体系结构 —(收藏版)
- 数据结构 | 顺序表
- MySQL--数据库基础知识点(一)
- python go高并发_天下武功为快不破,戏说Python与Go高并发争锋!
- 【Java基础系列】基本数据类型及包装类