gpt4 book ai didi

c - 从 timerfd 读取()时参数无效

转载 作者:太空宇宙 更新时间:2023-11-04 07:56:14 25 4
gpt4 key购买 nike

我有一个使用 timerfd_create() 创建计时器的程序,并且计时器指定了一个时间间隔,以便定期通知进程。然后将这个定时器注册到epoll。在处理程序中执行read()时,错误是Invalid argumenterrno是22。当我运行这个程序时出现这个错误我的 Raspberry Pi(Raspbian,Linux 4.9.80),但是当我在笔记本电脑(Arch,Linux 4.15.15)上运行时一切正常。

相关代码贴在下面。非常感谢任何帮助。

void epset_reg(int epfd, int fd, u32 events)
{
struct epoll_event ev;

memset(&ev, 0, sizeof(ev));
ev.data.fd = fd;
ev.events = events;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) < 0)
handle_err("epoll_ctl");
}

int init_timer(u32 interval)
{
int tfd;
struct itimerspec tspec;

/* specify the timer */
tspec.it_value.tv_sec = 1;
tspec.it_value.tv_nsec = 0;
tspec.it_interval.tv_sec = interval;
tspec.it_interval.tv_nsec = 0;

/* create timerfd */
if ((tfd = timerfd_create(CLOCK_MONOTONIC, 0)) < 0)
handle_err("timerfd_create");

/* arm (start) the periodic timer */
if (timerfd_settime(tfd, TFD_TIMER_ABSTIME, &tspec, NULL) < 0)
handle_err("timerfd_settime");

return tfd;
}

void handler(int tfd)
{
u64 exp;

/* THE ERROR ! */
if (read(tfd, &exp, sizeof(exp)) < 0)
handle_err("read");

/* irrelevant parts */
}

int main()
{
int epfd, tfd, sock, nfds, i;
struct epoll_event events[MAX_EVENTS];

/* create new epoll instance */
if ((epfd = epoll_create1(0)) < 0)
handle_err("epoll_create1");

/* obtain timerfd */
tfd = init_timer(TIMER_INTERVAL);
/* obtain socket to listen */
sock = init_socket(CC_PORT);

/* register sock and tfd to epoll set */
epset_reg(epfd, tfd, EPOLLIN);
epset_reg(epfd, sock, EPOLLIN | EPOLLET);

for (;;) {
if ((nfds = epoll_wait(epfd, events, MAX_EVENTS, -1)) < 0)
handle_err("epoll_wait");

for (i = 0; i < nfds; ++i) {
if ((events[i].events & EPOLLERR) ||
(events[i].events & EPOLLHUP) ||
(!(events[i].events & EPOLLIN))) {
fprintf(stderr, "epoll\n");
close(events[i].data.fd);
continue;
}

if (events[i].data.fd == tfd)
handler(tfd);
else if (events[i].data.fd == sock)
accept_conn(sock, epfd);
else
handle_message(events[i].data.fd);
}
}
}

完整的程序托管在 https://github.com/iamlazynic/centralized_wlan/tree/master/cc 上里面cc.cmain.c .

除了对这个问题的建议,如果有关于如何在这种情况下进行调试的建议,那就太好了。谢谢!

最佳答案

完成这个之后,我们发现 u64 的 typedef 是错误的,代码试图读取几个字节,这将导致 EINVAL 错误代码。 typedef 是:

typedef unsigned long int u64;

但是在 32 位系统上,这可能是 4 个字节的大小。相反,我们使用了 stdint.h 和 uint64_t 类型(它会针对您正在使用的平台更仔细地进行类型定义)并且现在具有正确的大小。

关于c - 从 timerfd 读取()时参数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49956721/

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