热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

eventfdman

概要#includeinteventfd(unsignedintinitval,intflags);描述eventfd()创建一个“eventfd对象”
概要
    #include

    int eventfd(unsigned int initval, intflags);




描述

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

从linux2.6.27开始,下面的值可以在flags中被 OR 来改变eventfd()的行为:

EFD_NONBLOCK 在新打开的文件描述符中设置O_NONBLOCK文件状态标示。使用这个标示节省了对fcntl的额外调            用。




EFD_CLOEXEC  在新打开的文件描述符中设置close-on-exec(FD_CLOEXEC)标示。




在linux2.6.26版本以下,flags参数都是不能够使用的,必须为0.




eventfd()返回一个新的与eventfd对象关联的文件描述符。下面的操作能在这个文件描述符上执行:

read

如果eventfd计数器为一个非0值,read返回包含这个值的8个字节,并且这个计数器的值被重置为0.(返回的值为主机字节序)。

如果read的时候计数器为0,调用要么阻塞直到计数器变为非0,要么失败返回EAGAIN,如果文件描述符是非阻塞的话。

read会失败返回EINVAL,如果提供的buffer大小小于8字节的话。




write

write调用向计数器增加一个由它的buffer提供的8字节整型值。计数器能存储的最大值是最大的无符号64位整型值少1(0xfffffffffffffffe)。如果增加导致计时器的值超过了最大值,write要么阻塞直到一个read在这个文件描述符上执行,要么返回EAGAIN,如果文件描述法是非阻塞的。

write会失败返回EINVAL,如果提供的buffer大小小于8字节的话,或者如果试图写入值0xffffffffffffff。




poll,select(等)

返回的文件描述符支持poll和select,如下:

文件描述符是可读的(seceltreadfds参数;)如果计数器值大于0.

文件描述符是可写的,如果它可以被写入一个至少为1的值而不会被阻塞。

如果计数器值被检测到溢出了,select会指示这个文件描述符为可读可写。如上所提醒的,write决不能溢出计数器。

eventfd文件描述符也支持其他文件多路转接API:pselcet,ppoll,epoll。




close

当文件描述符不再被需要的时候它要被关闭。当所有和同一个eventfd对象相联系的文件描述符被关系时,对象的资源就被内核清空。




由eventfd()创建的文件描述符拷贝被子进程通过fork所继承。文件描述符的副本是同同一个eventfd对象相联系的。由eventfd()创建的文件描述符在execve时被保留。




返回值

成功时,eventfd()返回一个新的eventfd文件描述符。失败时,返回-1,errno指出错误情况。




错误

EINVAL  标示不合法;在linux2.6.26或更早版本中,flags非0。

EMFILE   到达进程最大打开文件描述符限制。

ENFILE   到达系统总共能打开的文件数。

ENODEV   不能挂载匿名节点设备。

ENOMEM   没有创建一个新eventfd文件描述符的足够内存。




版本

eventfd()自从2.6.22开始可用。glibc版本2.8开始提供支持。eventfd2()系统调用从linux2.6.27开始可用。自从2.9开始,glibceventfd()用evnetfd2()系统调用封装,如果内核支持的话。




注意

应用可以使用一个eventfd文件描述符来取代一个管道,在所有管道用来作为事件通知的情况下。内核消耗在一个eventfd文件描述符上的远比在一个管道上的少,并且仅需要一个文件描述符(管道需要2个)。

当使用在内核中时,一个eventfd文件描述符能提供一个内核-用户空间的桥梁。

一个关于eventfd要指出的地方是它能像其他文件描述符一样用select,poll。epoll来监控。这意味着一个应用能同时监控:传统“文件的读端,和其他支持eventfd接口的内核机制的读端。




后面的不想翻译了

EXAMPLE

The following program creates an eventfd file descriptor and then forks tocreate a child process. While the parent briefly sleeps, the child writeseach of the integers supplied in the program's command-line arguments to theeventfd file descriptor. When the parent has finished sleeping, it reads fromthe eventfd file descriptor.

The following shell session shows a sample run of the program:

 $ ./a.out 1 2 4 7 14 

 Child writing 1 to efd 

 Child writing 2 to efd 

 Child writing 4 to efd 

 Child writing 7 to efd 

 Child writing 14 to efd 

 Child completed write loop 

 Parent about to readParent read 28 (0x1c) from efd

Program source

#include  

#include  

#include

#include  

#include  

  

 #define handle_error(msg) \ 

 do { perror(msg); exit(EXIT_FAILURE); } while (0) 

 intmain(int argc, char *argv[]) 

 {int efd, j; 

 uint64_t u; 

 ssize_t s; 

 if (argc <2) 


 fprintf(stderr, "Usage: %s ...\n", argv[0]); 

 exit(EXIT_FAILURE); 

 

 efd &#61; eventfd(0, 0);

 if (efd &#61;&#61; -1)handle_error("eventfd"); 

 switch (fork()) 


 case 0: 

 for (j &#61; 1; j


 printf("Child writing %s to efd\n", argv[j]);

 u &#61; strtoull(argv[j], NULL, 0); 

  

 s &#61; write(efd, &u, sizeof(uint64_t)); 

 if (s !&#61; sizeof(uint64_t)) 

 handle_error("write"); 

 

 printf("Child completed write loop\n"); 

 exit(EXIT_SUCCESS); 

 default:

 sleep(2); 

 printf("Parent about to read\n"); 

 s &#61; read(efd, &u, sizeof(uint64_t));

 if (s !&#61; sizeof(uint64_t)) 

 handle_error("read"); 

 printf("Parent read %llu (0x%llx) from efd\n",(unsigned long long) u, (unsigned long long) u); 

 exit(EXIT_SUCCESS); 

 case -1: 

 handle_error("fork"); 

 }

 }


推荐阅读
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
author-avatar
爱情只有确定键没有取消键_874
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有