linux之eventfd()
参考:
⼀、简介
简单来说,这个函数就是创建⼀个⽤于事件通知的⽂件描述符。它类似于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 (0)
int main(int argc, char **argv)
{
int efd, j;
uint64_t u;
ssize_t s;
if (argc < 2)
{
fprintf(stderr, "Usage: %s <num>...\n", argv[0]);
exit(EXIT_FAILURE);
}
linux下的sleep函数efd = eventfd(0, 0);
if (efd == -1)
{
handle_error("eventfd");
}
switch (fork())
{
case0:
for (j = 1; j < argc; j++)
{
printf("Child writing %s to efd\n", argv[j]);
u = strtoull(argv[j], NULL, 0);
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 -1:
handle_error("fork");
default:
sleep(2);
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则是把要写⼊的数字加到已有的整数上。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论