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 通过文件描述符来获取信号相关推荐

  1. 网络编程(part5)--文件读写偏移量及文件描述符

    鄙人学习笔记 文章目录 文件读写偏移量(文件指针) 定义 举个例子1(读写操作的文件偏移量) 举个例子2(文件偏移量的初始位置验证) 基本操作 举个例子1(tell()函数) 举个例子2(tell() ...

  2. linux存储--文件描述符以及file结构体(一)

    一.什么是文件描述符 在Linux下一切皆文件,对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数,当打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符.当读. ...

  3. 文件描述符fd是什么?

    文章目录 文件描述符 提出前提 简介 如何创建文件描述符 20220411 文件描述符扩展 文件描述符 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负 ...

  4. linux文件描述符 0 1 2,文件描述符

    内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件 ...

  5. Linux:如何获取打开文件和文件描述符数量

    一.linux的文件描述符 文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符.文件描述符是一 ...

  6. linux 内核 遍历文件夹,Linux内核中通过文件描述符获取绝对路径

    背景 在Linux内核中,已知一个进程的pid和其打开文件的文件描述符fd,如何获取该文件的绝对路径?基本思路是先获取该文件在内核中的file结构体,再通过d_path()获取到整个文件的绝对路径. ...

  7. Linux系统学习笔记:文件描述符标志

    文件描述符标志的概念 文件描述符标志(目前就只有一个close-on-exec): 它仅仅是一个标志,当进程fork一个子进程的时候,在子进程中调用了exec函数时就用到了这个标志.意义是执行exec ...

  8. linux c中的文件描述符与打开文件之间的关系

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通 ...

  9. Linux中通过Socket文件描述符寻找连接状态介绍

    针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...

最新文章

  1. 清华大学张悠慧:超越冯·诺依曼模型,实现软硬件去耦合的类脑计算(附视频)
  2. maven中pom.xml中依赖包代码的查询地址
  3. POJ 3469 Dual Core CPU (最小割建模)
  4. klib库下的kroundup32(二进制的四舍五入)算法
  5. 某站点下载资源自己主动评论器
  6. 20应用统计考研复试要点(part40)--概率论与数理统计
  7. leetcode-187-重复的DNA序列
  8. 各层作用_终于弄明白了 Singleton,Transient,Scoped 的作用域是如何实现的
  9. 自动生成mybatisplus的相关代码
  10. 基于React的可编辑在线简历模板
  11. Java书店管理系统
  12. 新会计准则 计算机管理系统,用友ERP供应链管理系统实验教程(新会计准则版)pdf...
  13. yum 装包时,提示Peer cert cannot be verified or peer cert invalid
  14. 计算机控制技术俞光昀练习答案,计算机控制技术 复习重点 ( 俞光昀)
  15. git如何安装aur_Linux┊一个好用的AUR工具yaourt | 简单.生活
  16. intval的绕过和chr的利用
  17. Excel自定义格式参数
  18. 天玑1300和骁龙778plus哪个好
  19. 《JavaEE初阶》HTTP协议和HTTPS
  20. 如何用Excel画出漂亮的图(office 2016)

热门文章

  1. 一台电脑同时安装IE6、IE7、IE8三种浏览器
  2. 实现IE6、IE7、IE8多版本浏览器共存
  3. 人,羊,狼,菜过河问题的计算机编程实现的matlab程序,人狼羊菜渡河问题(含Matlab程序)...
  4. 【PPT】绘制表格和多样式圆圈
  5. java实现手机短信发送的功能详细代码
  6. 冯诺依曼体系结构 —(收藏版)
  7. 数据结构 | 顺序表
  8. MySQL--数据库基础知识点(一)
  9. python go高并发_天下武功为快不破,戏说Python与Go高并发争锋!
  10. 【Java基础系列】基本数据类型及包装类