最高效的进(线)程间通信机制: eventfd
来源:互联网 发布:河北省网络行政学院 编辑:程序博客网 时间:2024/06/06 12:43
一句话总结:用于进程/线程间通信,效率比pipe高
#include <sys/eventfd.h>
int eventfd(unsigned int initval, int flags);
常用的进程(线程)间通信机制有管道、信号量、消息队列、信号、共享内存、socket等等,其中主要作为进程(线程)间通知/等待的有管道pipe和socket。从Linux 2.6.27版本开始增加了eventfd,主要用于进程或者线程间的通信(如通知/等待机制的实现)。
eventfd()创建了一个"eventfd object",能在用户态用做事件wait/notify机制,通过内核取唤醒用户态的事件。这个对象保存了一个内核维护的uint64_t类型的整型counter,这个counter初始值被参数initval指定,在Linux 2.6.26之前flags参数是没用的,必须指定为0。
initial:初始值
flags:
EFD_CLOEXEC: 调用exec后关闭
EFD_NONBLOCK:非阻塞模式
实例:
#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <stdint.h>#include <sys/eventfd.h>#define handle_error(msg) { perror(msg); exit(EXIT_FAILURE); }int main(int argc, char *argv[]){ //handle_error("handle_error test"); uint64_t writeCnt; int efd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); if (-1 == efd) handle_error("eventfd"); int ret = fork(); if(ret == 0) //子进程 { for (int j = 1; j < argc; j++) { printf("Child writing %s to efd\n", argv[j]); writeCnt = atoll(argv[j]); //把字符串转换成长长整型数 atoi atof atol ssize_t res = write(efd, &writeCnt, sizeof(uint64_t)); if (res != sizeof(uint64_t)) handle_error("write efd"); } printf("Child has completed write!\n"); exit(EXIT_SUCCESS); } else //父进程 { sleep(2); //等待子进程执行完毕 ssize_t res = read(efd, &writeCnt, sizeof(uint64_t)); if (res != sizeof(uint64_t)) handle_error("read efd"); printf("Parent read %lu from efd\n",(uint64_t)writeCnt); exit(EXIT_SUCCESS); } }
./eventfd 3 4 5
Child writing 3 to efd
Child writing 4 to efd
Child writing 5 to efd
Child has completed write!
Parent read 12 from end
结果12=3+4+5+初始值0
运行./eventfd
Child has completed write!
read efd: Resource temporarily unavailable
阅读全文
0 0
- 最高效的进(线)程间通信机制--eventfd
- 最高效的进(线)程间通信机制: eventfd
- eventfd与线程间通信
- virtio的eventfd机制浅析
- eventfd 进程间通知机制
- 进程间通信(4)---最高效的进程间通信方式--内存共享
- linux-muduo线程通信eventfd
- linux-线程/进程通信eventfd
- epoll+eventfd+libaio实现高效异步IO
- Linux eventfd的使用
- eventfd的用法
- 最高效的进制是什么?
- eventfd
- eventfd
- 最高效的程序员
- 最高效的学习方法
- 线程间的通信机制
- 进程间的通信机制
- Servlet安全性(3)----SSL
- bzoj 2763 [JLOI2011]飞行路线 Dijikstra 分层
- 物理吊桥交互
- 搜索
- hdu6071
- 最高效的进(线)程间通信机制: eventfd
- #define 中 # ## ##__VA_ARGS__
- python3 [爬虫入门实战]爬虫之scrapy安装与配置教程
- 分布式消息队列RocketMQ与Kafka架构上的巨大差异之1 -- 为什么RocketMQ要去除ZK依赖?
- 【PAT】【Advanced Level】1062. Talent and Virtue (25)
- [SDUT](2144)图结构练习——最小生成树 ---最小生成树(图)
- NIO的一些坑
- httpURLConnection-网络请求的两种方式-get请求和post请求
- 摆花