eventfd是linux 2.6.22后系统提供的一个轻量级的进程间通信的系统调用,eventfd通过一个进程间共享的64位计数器完成进程间通信,这个计数器由在linux内核空间维护,用户可以通过调用write方法向内核空间写入一个64位的值,也可以调用read方法读取这个值。


#include <unistd.h>
#include <iostream>
#include <sys/wait.h>
#include <sys/eventfd.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main()
{
int evfd = eventfd(10, 0);
uint64_t wdata = 0;
uint64_t rdata = 0;

if (read(evfd, &rdata, 8) == -1)
{
perror(NULL);
if (errno != EAGAIN)
return 0;
}
cout << "Init read : " << rdata << endl; //读计数器初始值

wdata = 20;

if (write(evfd, &wdata, 8) == -1) //父进程写20
{
perror(NULL);
return 0;
}
cout << "parent write : " << wdata << endl;

if (fork() == 0)
{
wdata = 30;
if (read(evfd, &rdata, 8) == -1) //子进程读计数器
{
perror(NULL);
return 0;
}
cout << "child read : " << rdata << endl;
if (write(evfd, &wdata, 8) == -1) //子进程写30
{
perror(NULL);
return 0;
}
cout << "child write : " << wdata << endl;
exit(0);
}
wait(NULL); /*有这个wait则子进程先执行*/
if (read(evfd, &rdata, 8) == -1) //父进程读计数器
{
perror(NULL);
return 0;
}
cout << "parent read : " << rdata << endl;

return 0;
}

运行结果:

sh-4.3$ ./main 
Init read : 10
parent write : 20
child read : 20
child write : 30
parent read : 30