软硬件开发技术笔记
保持专注,拒绝内耗
eventfd初体验
2022-02-23 23:20

简单一个例子介绍eventfd的使用,其中包括阻塞和非阻塞两种方式

阻塞实例

[root@home-dev-8 eventfd-test]# cat main.c
#include <unistd.h>
#include <sys/wait.h>
#include <sys/eventfd.h>
#include <errno.h>
#include <stdio.h>

int main() 
{
    // 引用计数默认值为10
    int evfd = eventfd(10, 0);

    // read/write都需要使用一个64位8字节的buf用来存数据
    uint64_t data = 0;

    // 读计数器初始值
    printf("main start read\n");
    if(read(evfd, &data, sizeof(data)) == -1)
    {
        perror("error");
        return -1;
    }
    printf("main read value : %d\n", data);

    // 创建子进程,父子进程用eventfd通讯
    if(fork() == 0) 
    {
        // 子进程阻塞读eventfd,由于父进程在sleep(3)秒后才会write,因此子进程应该在3面后才会读取到值
        printf("child start read\n");
        if(read(evfd, &data, sizeof(data)) == -1)
        {
            perror("error");
            return -1;
        }
        printf("child read : %d\n", data);
        return 0;
    }
    else 
    {
        // 父进程
        data = 999;
        sleep(3);
        printf("parent start write\n");
        if(write(evfd, &data, sizeof(data)) == -1)   //父进程读计数器
        {
            perror("error");
            return -1;
        }
        printf("parent write : %d\n", data);

        wait(NULL);
        return 0;
    }
}

阻塞运行结果

[root@home-dev-8 eventfd-test]# gcc main.c -o main
[root@home-dev-8 eventfd-test]# ./main 
main start read
main read value : 10
child start read
parent start write
parent write : 999
child read : 999   # 此处会阻塞等待主进程write

非阻塞实例

[root@home-dev-8 eventfd-test]# cat main.c 
#include <unistd.h>
#include <sys/wait.h>
#include <sys/eventfd.h>
#include <errno.h>
#include <stdio.h>

int main() {
    // 引用计数默认值为10
    int evfd = eventfd(10, EFD_NONBLOCK);

    // read/write都需要使用一个64位8字节的buf用来存数据
    uint64_t data = 0;

    // 读计数器初始值
    printf("main start read\n");
    if(read(evfd, &data, sizeof(data)) == -1) {
        perror("error");
        return -1;
    }
    printf("main read value : %d\n", data);

    // 创建子进程,父子进程用eventfd通讯
    if(fork() == 0) {
        // 子进程阻塞读eventfd,由于父进程在sleep(3)秒后才会write,因此子进程应该在3面后才会读取到值
        printf("child start read\n");
        while(read(evfd, &data, sizeof(data)) == -1) {
            printf("child read retry\n");
            sleep(1);
        }
        printf("child read : %d\n", data);
        return 0;
    }
    else {
        // 父进程
        data = 999;
        sleep(3);
        printf("parent start write\n");
        if(write(evfd, &data, sizeof(data)) == -1) {   //父进程读计数器
            perror("error");
            return -1;
        }
        printf("parent write : %d\n", data);

        wait(NULL);
        return 0;
    }
}

非阻塞运行结果

[root@home-dev-8 eventfd-test]# gcc main.c -o main
[root@home-dev-8 eventfd-test]# ./main 
main start read
main read value : 10
child start read
child read retry
child read retry
child read retry
parent start write
parent write : 999
child read : 999
分类
mac
1篇
4篇
c
1篇
4篇
2篇
1篇
搜索