好久没更新了,今天看一下第三种新的fd:eventfd类似于管道的概念,可以实现线程间的事件通知,所不同的是eventfd的缓冲区大小是sizeof(uint64_t)也就是8字节,它是一个64位的计数器,写入递增计数器,读取将得到计数器的值,并且清零。看一下代码:

[cpp] view plaincopy
  1. #include <sys/eventfd.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <stdint.h>             /* Definition of uint64_t */
  6. #define handle_error(msg) \
  7. do { perror(msg); exit(EXIT_FAILURE); } while (0)
  8. int
  9. main(int argc, char *argv[])
  10. {
  11. uint64_t u;
  12. int efd = eventfd(10, 0);
  13. if (efd == -1)
  14. handle_error("eventfd");
  15. int ret = fork();
  16. if(ret == 0)
  17. {
  18. for (int j = 1; j < argc; j++) {
  19. printf("Child writing %s to efd\n", argv[j]);
  20. u = atoll(argv[j]);
  21. ssize_t s = write(efd, &u, sizeof(uint64_t));
  22. if (s != sizeof(uint64_t))
  23. handle_error("write");
  24. }
  25. printf("Child completed write loop\n");
  26. exit(EXIT_SUCCESS);
  27. }
  28. else
  29. {
  30. sleep(2);
  31. ssize_t s = read(efd, &u, sizeof(uint64_t));
  32. if (s != sizeof(uint64_t))
  33. handle_error("read");
  34. printf("Parent read %llu from efd\n",(unsigned long long)u);
  35. exit(EXIT_SUCCESS);
  36. }
  37. }

比较简单,不做过解释。子进程写入命令行中传入的参数,父进程读取其中计数器的值。

运行结果:

[cpp] view plaincopy
  1. ./eventfd 10 20 30
  2. Child writing 10 to efd
  3. Child writing 20 to efd
  4. Child writing 30 to efd
  5. Child completed write loop
  6. Parent read 70 from efd

命令行传入的是10、20、30其和应为60,为啥读取的是70呢?请看15行调用eventfd时第一个参数是10,这个参数是创建eventfd时初始化计数器的值。

linux新的API signalfd、timerfd、eventfd使用说明——eventfd相关推荐

  1. linux新的API signalfd、timerfd、eventfd使用说明

    三种新的fd加入linux内核的的版本: signalfd:2.6.22 timerfd:2.6.25 eventfd:2.6.22 三种fd的意义: signalfd:传统的处理信号的方式是注册信号 ...

  2. Pipelines - .NET中的新IO API指引(二)

    原文:Pipelines - a guided tour of the new IO API in .NET, part 2 作者:marcgravell 在上一章,我们讨论了以往的StreamAPI ...

  3. Linux 系统下命令 unrar 的中文版使用说明

    查看英文版,猛戳<Linux 系统下命令 unrar 的英文版使用说明> $ rar --help用法: rar <命令> -<选项 1> -<选项 N> ...

  4. linux线程同步 eventfd,用 eventfd 在线程之间通信

    最近有想法把网络库推广成能在线程,同主机进程和不同主机之间的通信的公共中间件.后面两样都可以用 socket. 当然同主机进程也可以用别的,先不想那么多.我要说的线程之间,要实现和 socket 统一 ...

  5. 用xinnet新网API实现动态域名

    最近发现托管的免费动态IP受政策管制.商业收费策略.技术平台稳定性等等,变得非常不稳定.自己正好是新网代理资质,也有API和自己的域名,便尝试使用自己的方案更新域名.这样家里的服务器就能使用FTP,以 ...

  6. 利用新浪API实现数据的抓取\微博数据爬取\微博爬虫 1

    PS:(本人长期出售超大量微博数据.旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com.由于微博接口更新后限制增大,这个代码已经不能用来爬 ...

  7. api.php t.cn,PHP通过调用新浪API生成t.cn格式短网址链接的方法详解

    本文实例讲述了PHP通过调用新浪API生成t.cn格式短网址链接的方法.分享给大家供大家参考,具体如下: 新浪提供了长链接转为短链接的API,可以把长链接转为 t.cn/xxx 这种格式的短链接. A ...

  8. php新浪api,php调用新浪短链接API的方法,php调用新浪api_PHP教程

    php调用新浪短链接API的方法,php调用新浪api 本文实例讲述了php调用新浪短链接API的方法.分享给大家供大家参考.具体方法如下: 复制代码 代码如下: //Sina App_Key def ...

  9. 210314阶段三VS使用Linux 的sqlite3 API

    目录 一.学习的知识点 1.聊天系统框架 2.VS使用Linux sqlite3 API 2.1 在项目->属性-> 链接器->命令行 处添加 -lsqlite3 2.2 在 项目- ...

最新文章

  1. google浏览器插件安装时出错,Package is invalid: CRX HEADER INVALID
  2. Building and running Node.js for Android
  3. php https server_使用https,$_SERVER['HTTPS']却不等于on?
  4. 【Linux 内核】CFS 调度器 ⑥ ( CFS 调度器就绪队列 cfs_rq | Linux 内核调度实体 sched_entity | “ 红黑树 “ 数据结构 rb_root_cached )
  5. php通过Mysqli和PDO连接mysql数据详解
  6. 和老婆在MSN上面的涂鸦
  7. 【转载】js数组的操作
  8. linux命令行的操作符,Linux shell 比较运算符使用方法教程
  9. Shell解析curl返回的json数据
  10. n阶行列式计算Python和C语言实现
  11. 一个困扰我很久的问题
  12. js调用原生android应用的方法
  13. js网页右下角弹窗js特效
  14. 两路VL53L0X激光测距传感器的使用
  15. 产生按指数分布的随机数----摘自csdn
  16. C++中 itoa 和 atoi 的用法
  17. CS61A fa2021 Composing Programs 2.8 Efficiency 效率
  18. 有道笔记无法同步(笔录)
  19. 活动图(Activity Diagram)—UML图(四)
  20. Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(2) C语言经典笔面试题(下)

热门文章

  1. c语言函数大全 chm,【oeasy丨c语言丨函数】C语言库函数使用大全CHM版
  2. mysql 4 中文模糊查询_解决MySQL中文模糊查询问题
  3. spring框架中@PostConstruct的实现原理
  4. 数据库实验四 用户权限管理
  5. IDEA全文搜索排除无用的文件夹
  6. matlab 8.4,《DSP using MATLAB》Problem 8.42
  7. unity2018关联不到vs_现实VS真爱:远嫁的幸福和悲哀
  8. 字符串截取后两位,字符串转成数组,再转换位字符串
  9. (JAVA)CollectionDemo1
  10. ORM是什么?如何理解ORM