最高效的进(线)程间通信机制: 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





原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果6屏幕进水了怎么办 雷神3锤子碎了怎么办 翻墙网速太慢怎么办 wow神器选错了怎么办 wow dk老拉嘲讽怎么办 4k屏幕字体太小怎么办 车被冰雹打了怎么办 玩3d游戏头晕怎么办 dnf黑龙大会秒杀怎么办 黑曼巴c挂不上弦怎么办 费效比超过100%怎么办 入职体检不报销怎么办 入职体检过不了怎么办 入职体检血糖高怎么办 入职体检没过怎么办 入职体检血压高怎么办 看病没带医保卡怎么办 孕妇8个月血压高怎么办 怀孕3个月血压高怎么办 怀孕3个月血压低怎么办 38周孕妇血压高怎么办 孕前检查后怀孕怎么办 精子a加b成活率底怎么办 怀孕五周孕酮低怎么办 怀孕38天孕酮低怎么办 刚怀孕了孕酮低怎么办 怀孕2个月孕酮低怎么办 怀孕七周孕酮低怎么办 孕前检查孕酮低怎么办 甘油三酯偏高7.2怎么办 入职体检来例假怎么办 6激素检查喝水了怎么办 抽血前吃了东西怎么办 怀孕一个月孕酮低怎么办 怀孕了老是有痰怎么办 孕妇有很多白痰怎么办 血糖高怎么办吃什么好 5年糖尿病血糖高怎么办 血糖高引起的视力模糊怎么办 谷丙转氨酶和谷草转氨酶高怎么办 产检血糖有点高怎么办