若是设置了EFD_NONBLOCK,read的时候就会直接返回,不论是否有值。若是有值,则返回uint64_t的大小,否则返回-1。 EFD_SEMAPHORE创建信号量类型的文件描述符。当设置为EFD_SEMAPHORE后,eventfd则不再是一个普通的读写通知,而是作为信号的读写通知。即之前是write一个数字后,内部计数器会将数字累加,可以通过read将该数...
eventfd文件描述符的标志,可由三种选项组成:EFD_CLOEXEC、EFD_NONBLOCK和EFD_SEMAPHORE。 EFD_CLOEXEC:表示返回的eventfd文件描述符在fork后exec其他程序时会自动关闭这个文件描述符; EFD_NONBLOCK:设置返回的eventfd非阻塞; EFD_SEMAPHORE: 表示将eventfd作为一个信号量来使用。 读eventfd read(2) 1.read函数会从eventfd...
#include<sys/eventfd.h>#include<unistd.h>#include<iostream>intmain(){intefd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); eventfd_write(efd,2);// 写入2,计数器为2eventfd_write(efd,3);// 写入3, 计数器为2 + 3 = 5eventfd_write(efd,4);// 写入3, 计数器为5 + 4 = 9eventfd_tcount;...
eventfd (no reuse, create new every time)37efd=eventfd(1,EFD_CLOEXEC|EFD_NONBLOCK);38if(efd==-1)handle_error("eventfd create: %s",strerror(errno));39// register to poller40event.data.fd=efd;41event.events=EPOLLIN|EPOLLET;// Edge-Triggered42ret=epoll_ctl(epfd,EPOLL_CTL_ADD,efd,&event...
EFD_NONBLOCK:文件会被设置成O_NONBLOCK,一般要设置。 EFD_SEMAPHORE:(2.6.30以后支持)支持semophore语义的read,简单说就值递减1。 这个新建的fd的操作很简单: read(): 读操作就是将counter值置0,如果是semophore就减1。 write(): 设置counter的值。
EFD_NONBLOCK:设置返回的eventfd非阻塞; EFD_SEMAPHORE表:表示将eventfd作为一个信号量来使用。 int eventfd_write(int fd, eventfd_t value); //向eventfd写入一个值 在没有设置EFD_SEMAPHORE的情况下,write函数会将发送buf中的数据写入到eventfd对应的计数器中,最大只能写入0xffffffffffffffff,否则返回EINVAL错误;...
EFD_NONBLOCK:在新建的文件描述符上设置O_NONBLOCK文件状态标志; EFD_CLOEXEC:在新建的文件描述符上设置FD_CLOEXEC标志。 eventfd返回的文件描述符可以执行下面的操作: read:如果eventfd的计数器的值非0,则read操作在一个8字节缓冲区中返回该值,并且将计数器重置为0,返回的值是主机字节序。如果计数器的值为0,若文...
如果累加计数将超过该最大值, 该调用将一直阻塞;除非创建eventfd时指定了EFD_NONBLOCK标识,它才会返回EAGAIN错误。 poll(2):如果计数值大于零,并且在events中监听了POLLIN标识,poll(2)就会返回,同时在revents中标记相应的文件描述符可读。类似的,如果监听了POLLOUT事件, 并且write(2)调用可以至少写1进去,那么poll(2...
BUILD_BUG_ON(EFD_NONBLOCK != O_NONBLOCK); if (flags & ~EFD_FLAGS_SET) return -EINVAL; // 分配eventfd_ctx内存资源 ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); if (!ctx) return -ENOMEM; // 设置eventfd_ctx的引用计数kref_init(&ctx->kref); ...
intefd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);eventfd_write(efd,2); // 写入2,计数器为2eventfd_write(efd,3); // 写入3, 计数器为2+3=5eventfd_write(efd,4); // 写入3, 计数器为5+4=9eventfd_tcount;intread_result = eventfd_read(efd, &count);std::cout <<"read_result="<< ...