gpt4 book ai didi

c - epoll_wait 的替代方案,它不等待文件描述符?

转载 作者:太空狗 更新时间:2023-10-29 12:07:20 24 4
gpt4 key购买 nike

我有一个使用 timerfd_create 创建计时器的程序(计时器到期时设置文件描述符)。

问题是,我正在使用 epoll_wait 等待文件描述符,然后使用 fd=revent.data.fdfd= 检查过期timer_fd(见下面的程序)。

但是如果我这样做,epoll_wait 会阻止我的程序直到计时器到期,我不希望这种情况发生。我希望程序运行,并且我会定期检查计时器是否到期.有什么替代方法吗?

请看下面的程序。

enter code here
#include <sys/timerfd.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/epoll.h>
#include <time.h>

int main()
{
struct itimerspec its;
struct epoll_event event, revent;

int timer_fd, efd, fd1, fd2;

/* Setting timer interval */

its.it_interval.tv_sec=1;
its.it_interval.tv_nsec=0;

/* Setting timer expiration */

its.it_value.tv_sec=5;
its.it_value.tv_nsec=0;

efd=epoll_create(2);

timer_fd=timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK);

event.data.fd=timer_fd;
event.events=EPOLLIN|EPOLLPRI;
epoll_ctl(efd, EPOLL_CTL_ADD, timer_fd, &event);

if(timer_fd==-1)
{
fprintf(stderr,"timerfd_settime error:");
exit;
}

if(timerfd_settime(timer_fd, 0, &its, NULL)==-1)
{
fprintf(stderr,"timerfd_settime error:");
exit;
}

printf("Starting the timer...");
fd1=epoll_wait(efd, &revent, 1, -1);

if(fd1<0) {
fprintf(stderr, "epoll_wait error\n");
exit;
}
else {

fprintf(stdout, "number of fds: %d",fd1);
}

fd2=revent.data.fd;

if(fd2==timer_fd) {
printf("Timer expired\n");

// IMPORTANT: This i want to check periodically without epoll_wait which blocks the program, What is the alternative?
}

最佳答案

不是用 epoll 轮询,因为你只在等待一个计时器,你可以通过 read 来检查它是否过期。它过期的次数将存储在您正在读取的缓冲区中,或者如果它没有过期,读取将失败并显示再次出错。

// set up timer
// ...

uint64_t expirations;
if ((read(timer_fd, &expirations, sizeof(uint64_t))==-1) && errno == EAGAIN) {
printf("Timer has not expired yet.\n");
} else {
printf("Timer has expired %llu times.\n", expirations);
}

请注意,您需要使用标志 TFD_NONBLOCK 来初始化 timer_fd,否则 read 将在未过期时阻塞还不如失败,但你已经做到了。

关于c - epoll_wait 的替代方案,它不等待文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6093716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com