return do_eventfd(count, 0); } eventfd2与eventfd最大的区别,是eventfd2增加一个额外的参数flag EFD_CLOEXEC (02000000):就是fork子进程时不继承父进程资源,对于多线程的程序通常设置此值。 EFD_NONBLOCK(00004000):非堵塞模式O_NONBLOCK EFD_SEMAPHORE(0):支持semophore语义的read,简单说就值递减1。 do_eventfd...
#include<iostream>#include<assert.h>#include<poll.h>#include<signal.h>#include<sys/eventfd.h>#include<unistd.h>#include<string.h>#include<thread>staticints_efd =0;intcreateEventfd(){intevtfd =eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); std::cout <<"createEventfd() fd : "<< evtfd <<...
4.如果eventfd设置了EFD_SEMAPHORE,那么每次read就会返回1,并且让eventfd对应的计数器减一;如果eventfd没有设置EFD_SEMAPHORE,那么每次read就会直接返回计数器中的数值,read之后计数器就会置0。不管是哪一种,当计数器为0时,如果继续read,那么read就会阻塞(如果eventfd没有设置EFD_NONBLOCK)或者返回EAGAIN错误(如果eventfd设...
EFD_NONBLOCK:在新建的文件描述符上设置O_NONBLOCK文件状态标志; EFD_CLOEXEC:在新建的文件描述符上设置FD_CLOEXEC标志。 eventfd返回的文件描述符可以执行下面的操作: read:如果eventfd的计数器的值非0,则read操作在一个8字节缓冲区中返回该值,并且将计数器重置为0,返回的值是主机字节序。如果计数器的值为0,若文...
int event_fd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); int ep_fd = epoll_create1(EPOLL_CLOEXEC); create_epoll(){ struct epoll_event event; event.data.fd = event_fd; event.events = EPOLLIN | EPOLLET; epoll_ctl(ep_fd, EPOLL_CTL_ADD, event_fd, &event); ...
EFD_NONBLOCK , 功能同open(2) 的O_NONBLOCK,设置对象为非阻塞状态,如果没有设置这个状态的话,read(2)读eventfd,并且计数器的值为0 就一直堵塞在read调用当中,要是设置了这个标志, 就会返回一个 EAGAIN 错误(errno = EAGAIN)。效果也如同 额外调用select(2)达到的效果。
EFD_NONBLOCK:设置返回的eventfd非阻塞; EFD_SEMAPHORE表:表示将eventfd作为一个信号量来使用。 int eventfd_write(int fd, eventfd_t value); //向eventfd写入一个值 在没有设置EFD_SEMAPHORE的情况下,write函数会将发送buf中的数据写入到eventfd对应的计数器中,最大只能写入0xffffffffffffffff,否则返回EINVAL错误;...
如果eventfd设置了EFD_SEMAPHORE,那么每次read就会返回1,并且让eventfd对应的计数器减一;如果eventfd没有设置EFD_SEMAPHORE,那么每次read就会直接返回计数器中的数值,read之后计数器就会置0。不管是哪一种,当计数器为0时,如果继续read,那么read就会阻塞(如果eventfd没有设置EFD_NONBLOCK)或者返回EAGAIN错误(如果eventfd设置...
第二个参数是描述这个事件对象的属性,可以设置为EFD_NONBLOCK , EFD_CLOEXEC;前面的是设置对象为非阻塞状态,如果没有设置为非阻塞状态,read系统调用来读这个计数器,且计数器的值为0时,就会一直阻塞在read系统调用上,反之如果设置了该标志位,就会返回EAGAIN错误。后面的EFD_CLOEXEC功能是在程序调用exec()函数族加载其...
EFD_NONBLOCK创建非阻塞式的文件描述符。对于eventfd而言,若是当前没有被写入内容,即内部计数器值为0,此时对其进行读取的时候,线程会阻塞在read方法中。若是设置了EFD_NONBLOCK,read的时候就会直接返回,不论是否有值。若是有值,则返回uint64_t的大小,否则返回-1。