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