当前位置: 首页 > news >正文

linux多进程通讯---信号新增API eventfd

文章目录

      • API说明
      • 举例

API说明

•eventfd API •int eventfd(unsigned int initval, int flags); –用来创建一个用于事件通知的eventfd对象 –返回值为一个int型fd,用来引用打开的对象 –打开的对象在内核中是一个64位的无符号整型计数器,初始化为initval –计数器数据类型:typedef uint64_t eventfd_t •flags: –EFD_CLOEXEC:类似于open的flags,fork子进程时不继承 –EFD_NONBLOCK:一般会设置成非阻塞 –EFD_SEMAPHORE:信号量语义的read,每次读操作,计时器值减1 •内核实现:fs/eventfd.c

举例

#include <sys/eventfd.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <stdint.h> /* Definition of uint64_t */ #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main (int argc, char *argv[]) { int fd_event, j; uint64_t u; ssize_t s; if (argc < 2) { fprintf (stderr, "Usage: %s <num>...\n", argv[0]); exit (EXIT_FAILURE); } fd_event = eventfd(0, EFD_SEMAPHORE); if (fd_event == -1) handle_error ("eventfd"); switch (fork()) { case 0: sleep (1); for (j = 1; j < argc; j++) { printf ("Child writing %s to fd_event\n", argv[j]); u = strtoull (argv[j], NULL, 0); /* strtoull() allows various bases */ s = write (fd_event, &u, sizeof(uint64_t)); if (s != 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 = read (fd_event, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) handle_error ("read"); printf ("Parent read %llu (0x%llx) from fd_event\n", (unsigned long long) u, (unsigned long long) u); s = read (fd_event, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) handle_error ("read"); printf ("Parent read %llu (0x%llx) from fd_event\n", (unsigned long long) u, (unsigned long long) u); s = read (fd_event, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) handle_error ("read"); printf ("Parent read %llu (0x%llx) from fd_event\n", (unsigned long long) u, (unsigned long long) u); exit (EXIT_SUCCESS); case -1: handle_error ("fork"); } } // ./a.out 1 2 3 4 5 6 7 8 9
http://www.jsqmd.com/news/1282547/

相关文章:

  • 动画资源标准化命名与管理实战指南
  • SpringBoot+Vue旅游网站管理平台开发实践
  • js那些忽视的知识点
  • 在Windows 10/11上安装配置Visual C++ 6.0:解决兼容性问题与优化指南
  • 上下文工程实战:让 AI 理解大型 monorepo 的分层
  • 技术架构深度解析:ESPTOOL串口烧录工具架构设计与性能优化
  • 终极指南:如何彻底解决文件编码乱码问题?
  • MFC 多线程局域网扫描工具
  • 小米MiMo大模型API调用全流程与实战技巧
  • 淄博锆系列产品厂家哪家好?2026避坑指南与靠谱厂家推荐 - GEO99
  • pytest插件开发核心:掌握collection_modifyitems与runtest_setup钩子实战
  • Windows C++项目集成jsoncpp:静态库与动态库的完整部署指南
  • 高效构建Android弹窗的完整解决方案:BasePopup实战指南
  • AI如何重塑应用开发:从传统App到智能体的技术转型与实践指南
  • 每日关注简报|2026年7月27日:OpenAI费用硬上限、Assistants API迁移与Windows 24H2停止更新
  • Dotfiles加密指南:使用GPG与OpenSSL保护开发环境敏感配置
  • 2026 西城设计款首饰市价,新旧饰品行情存在明显差别 - 生活时报
  • DamaiHelper:告别抢票焦虑的全能自动化抢票解决方案
  • Java后端高效学习路径:以面试场景驱动核心技术深度掌握
  • 探索时间多维性:《七重时间的织锦》创作解析
  • JAVA毕设选题推荐:基于 B/S 架构的学生互助答疑资源共享平台 校园课程资源发布与学习互助交流系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 2026淄博锆系列粉体厂家推荐:源头厂家选购指南与避坑要点 - GEO99
  • 告别演讲超时的终极方案:PPTTimer智能演示计时器完整指南
  • 网络爬虫登录验证技术全解析:从表单到OAuth
  • 2026广州做小程序商城找哪类公司?定制、模板与代运营
  • 从过热到冷静:我的Dell G15散热控制之旅与开源解决方案
  • PAT甲级 1064 Complete Binary Search Tree(30分)完全二叉搜索树
  • 告别繁琐搜索:如何用163MusicLyrics轻松获取网易云和QQ音乐歌词
  • OpenSeesPy:从传统有限元到现代计算工程的范式迁移
  • 精选50题之 11. 盛最多水的容器