说该问题之前我们需要首先介绍一下eventfd的作用:
一、eventfd作用
#include <sys/eventfd.h>
int eventfd(unsigned int initval, intflags);
参数解释:
如果是2.6.26或之前版本的内核,flags 必须设置为0。
Initval:初始化计数器值,该值(暂时取名为A)保存在内核。
Flags支持一下标志位:
EFD_NONBLOCK 类似于使用O_NONBLOCK标志设置文件描述符。
EFD_CLOEXEC 类似open以O_CLOEXEC标志打开,
O_CLOEXEC 应该表示执行exec()时,之前通过open()打开的文件描述符会自动关闭测试时,
在open()之后,调用一下exec(),在新的进程中检测描述符是否已经关闭
返回值:
函数返回一个文件描述符,与打开的其他文件一样,可以进行读写操作。
read/write操作返回的文件描述符
Read:如果计数器A的值不为0时,读取成功,获得到该值。
如果A的值为0,非阻塞模式时,会直接返回失败,并把error置为EINVAL
如果为阻塞模式,一直会阻塞到A为非0为止。
Write:将缓冲区写入的8字节整形值加到内核计数器上,即会增加8字节的整数在计数器A上