linux之eventfd()
2024-09-25 18:03:23
参考:http://www.man7.org/linux/man-pages/man2/eventfd.2.html
一、简介
简单来说,这个函数就是创建一个用于事件通知的文件描述符。它类似于pipe,但是不像pipe一样需要两个描述符,它只需要一个描述就可以实现进程间通信了。
详细的介绍请看参考资料。
二、使用
示例:
#include <sys/eventfd.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h> /* Definition of uint64_t */ #define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while () int main(int argc, char **argv)
{
int efd, j;
uint64_t u;
ssize_t s; if (argc < )
{
fprintf(stderr, "Usage: %s <num>...\n", argv[]);
exit(EXIT_FAILURE);
} efd = eventfd(, );
if (efd == -)
{
handle_error("eventfd");
} switch (fork())
{
case :
for (j = ; j < argc; j++)
{
printf("Child writing %s to efd\n", argv[j]);
u = strtoull(argv[j], NULL, );
s = write(efd, &u, sizeof(uint64_t));
if (s != sizeof(uint64_t))
{
handle_error("write");
}
}
printf("Child completed write loop\n");
exit(EXIT_SUCCESS);
case -:
handle_error("fork"); default:
sleep(); printf("Parent about to read\n");
s = read(efd, &u, sizeof(uint64_t));
if (s != sizeof(uint64_t))
{
handle_error("read");
}
printf("Parent read %llu (0x%llx) from efd\n", (unsigned long long)u, (unsigned long long)u);
exit(EXIT_SUCCESS);
}
}
执行结果:
三、疑问
为什么写入这个文件描述符的数字,读取到的居然是它们的和?
明白了,仔细看了一下在该文件描述符上的read、write操作,就理解了,read从该文件描述符读取一个uini64_t类型的整数,write则是把要写入的数字加到已有的整数上。
最新文章
- android studio 导入项目太慢(卡条)
- yii 常用的多表查询
- 跟着百度学PHP[4]-OOP面对对象编程-2-属性和方法
- scrollIntoView
- Chorme中启动阿里旺旺误点取消启动并记住选择,如何更改。
- Linux bash运维操作日志审计(单服务器)
- 使用Parallel
- Java学习笔记之:Java 流
- EntityFramework Code First 优化-IIS 8的第一次优化请求配置
- Hadoop作业提交之TaskTracker获取Task
- 快速搭建一个Spring Boot + MyBatis的开发框架
- IDEA_Springboot启动Tomcat报错_APR
- python判断两个变量是否为同一数据类型
- 软件测试day1
- Monkey脚本API简介
- 基于 HTML5 的工业组态高炉炼铁 3D 大屏可视化
- 不得不补:PHP的JSON, SQL
- Beta阶段冲刺---Day5
- jedisClient操作redis实现增删改查功能
- DVWA的Xss跨站总结