Linux进程间通信 --eventfd

Linux进程间通信 --eventfd

最近在学习多线程网络库muduo时,新学了一种新的进程通信方法eventfd。

它是从LINUX 2.6.27版本开始增加的,主要用于进程或者线程间的通信(如通知/等待机制的实现)。

我们知道,在进行IO多路复用的时候,比如select、poll、epoll等,线程会阻塞在这些监听函数上面。有时候,我们需要在没有监听事件到来时,将线程从阻塞的监听函数中唤醒。

常用的唤醒方法是:建立一个管道,将管道的一端置于监听函数上,当我们想要唤醒线程时,像管道的另一端写入数据。

eventfd通信调用为上述过程提供了更加方便的实现形式 。只能在父子进程中做简单的消息通知,性能上比pipe好一些。

#include<sys/eventfd.h>
int eventfd(unsigned int initval, int flags);
//返回对象的文件描述符

eventfd()创建一个“eventfd对象”,这个对象能被用户空间应用用作一个事件等待/响应机制,靠内核去响应用户空间应用事件。这个对象包含一个由内核保持的无符号64位整型计数器。这个计数器由参数initval说明的值来初始化。
它的标记可以有以下属性:

EFD_CLOECEX,EFD_NONBLOCK,EFD_SEMAPHORE。

它返回了一个引用eventfd object的描述符。这个描述符可以支持以下操作:

read: 如果计数值counter的值不为0,读取成功,获得到该值,读取后count值变为0。如果counter的值为0,非阻塞模式,会直接返回失败,并把errno的值指纹EINVAL。如果为阻塞模式,一直会阻塞到counter为非0位置。

write: 会增加8字节的整数在计数器counter上,如果counter的值达到0xfffffffffffffffe时,就会阻塞。直到counter的值被read。阻塞和非阻塞情况同上面read一样。

close: 这个操作不用说了。

参考博客链接:https://blog.csdn.net/a_tu_/article/details/80325645

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值