linux新的API signalfd、timerfd、eventfd使用说明
来源:互联网 发布:java 全角半角转换 编辑:程序博客网 时间:2024/05/21 17:33
三种新的fd加入linux内核的的版本:
signalfd:2.6.22
timerfd:2.6.25
eventfd:2.6.22
三种fd的意义:
signalfd:传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、poll、epoll等监听队列中。
timerfd:可以实现定时器的功能,将定时器抽象为文件描述符,当定时器到期时可以对其read,这样也可以放到监听队列的主循环中。
eventfd:实现了线程之间事件通知的方式,eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。
三种新的fd都可以进行监听,当有事件触发时,有可读事件发生。
signalfd涉及API:
参数fd:如果是-1则表示新建一个,如果是一个已经存在的则表示修改signalfd所关联的信号;
参数mask:信号集合;
参数flag:内核版本2.6.27以后支持SFD_NONBLOCK、SFD_CLOEXEC;
成功返回文件描述符,返回的fd支持以下操作:read、select(poll、epoll)、close
timerfd涉及的API
eventfd涉及API:
创建一个eventfd,这是一个计数器相关的fd,计数器不为零是有可读事件发生,read以后计数器清零,write递增计数器;返回的fd可以进行如下操作:read、write、select(poll、epoll)、close
这是三种新的fd的基本概念,接下来的几篇会通过例子程序来说明各种fd的用法。
上一篇介绍了三种fd的概念,今天看一下signalfd的例子程序,直接上代码,稍后做一点说明。
L17-L21:将感兴趣的信号加入到sigset_t中;L24:调用signalfd,把信号集与fd关联起来,第一个参数为-1表示新建一个signalfd,不是-1并且是一个合法的signalfd表示向其添加新的信号。
L29:阻塞等待信号的发生并读取。根据读取的结果可以知道发生了什么信号。
编译运行,可以看一下效果是不是很简单。详细信息可以在Linux下面:man signalfd,例子程序就是摘自man。
看一下timerfd的例子,上代码:
相关结构体如下:
代码L25-L29:初始化定时器的参数,初始间隔与定时间隔。
L32:创建定时器fd,CLOCK_REALTIME:真实时间类型,修改时钟会影响定时器;CLOCK_MONOTONIC:相对时间类型,修改时钟不影响定时器。
L35:设置定时器的值。
L44:阻塞等待定时器到期。返回值是未处理的到期次数。比如定时间隔为2秒,但过了10秒才去读取,则读取的值是5。
编译运行:编译时要加rt库(g++ -lrt timerfd.cc -o timerfd)
[root@localhost appTest]# ./timerfd 5 2 10
printTime: current time:1357391736.146196 timer started
printTime: current time:1357391741.153430 read: 1; total=1
printTime: current time:1357391743.146550 read: 1; total=2
printTime: current time:1357391745.151483 read: 1; total=3
printTime: current time:1357391747.161155 read: 1; total=4
printTime: current time:1357391749.153934 read: 1; total=5
printTime: current time:1357391751.157309 read: 1; total=6
printTime: current time:1357391753.158384 read: 1; total=7
printTime: current time:1357391755.150470 read: 1; total=8
printTime: current time:1357391757.150253 read: 1; total=9
printTime: current time:1357391759.149954 read: 1; total=10
[root@localhost appTest]#
第一个参数5为第一次定时器到期间隔,第二个参数2为定时器的间隔,第三个参数为定时器到期10次则退出。程序运行(5+2*10)S退出。
详细信息可以:man timerfd_create
好久没更新了,今天看一下第三种新的fd:eventfd类似于管道的概念,可以实现线程间的事件通知,所不同的是eventfd的缓冲区大小是sizeof(uint64_t)也就是8字节,它是一个64位的计数器,写入递增计数器,读取将得到计数器的值,并且清零。看一下代码:
比较简单,不做过解释。子进程写入命令行中传入的参数,父进程读取其中计数器的值。运行结果:
命令行传入的是10、20、30其和应为60,为啥读取的是70呢?请看15行调用eventfd时第一个参数是10,这个参数是创建eventfd时初始化计数器的值。- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- Linux 新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- Linux 新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明
- linux新的API signalfd、timerfd、eventfd使用说明——signalfd
- linux新的API signalfd、timerfd、eventfd使用说明——timerfd
- linux新的API signalfd、timerfd、eventfd使用说明——eventfd
- linux新的API signalfd、timerfd、eventfd使用说明——eventfd
- signalfd、timerfd、eventfd使用说明
- 图的邻接表结构
- 用Telnet测试端口号
- 修改DB2中日期显示的格式
- Error:Uncaught translation error: java.lang.IllegalArgumentException: already added: Landroid/suppor
- 深度学习平台集锦
- linux新的API signalfd、timerfd、eventfd使用说明
- jstl_foreach
- C++之学习处理模板化基类内的名称(43)---《Effective C++》
- c++在线编写程序,常见的输入数据格式 和本地编译器输入的区别
- Generator函数基础
- ZooKeeper详细解析
- 哈希表的设计与实现
- Android RecyclerView <二> fragment+ItemDecoration
- 线段的重叠 51Nod