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