在计时器 fd 上执行 lseek 时出错

Posted

技术标签:

【中文标题】在计时器 fd 上执行 lseek 时出错【英文标题】:error while doing lseek on a timer fd 【发布时间】:2014-03-05 19:30:07 【问题描述】:

这篇文章:

Empty or "flush" a file descriptor without read()?

,表示可以在您不想读取的 fd 上执行 lseek(),从而避免不必要的复制,但这不适用于我使用 timerfd_create() 创建的 fd。为什么会这样?是否存在解决方法(使用read() 除外,它有效)。

我尝试像这样lseek()

lseek(fd, 0, SEEK_END);

strerror() 返回了Illegal seek。同样,read(fd, buffer, 8) 有效。

【问题讨论】:

【参考方案1】:

timer_fds 不可搜索。不是每个fd 都是。使用read 读取相关字节。

请注意,与POSIX 标签相反,这些调用是特定于Linux 的。从手册页:

CONFORMING TO
       These system calls are Linux-specific.

【讨论】:

我知道,但是定时器 fd 不是 fifo,也不是管道。 posix 规范在哪里说我不能在计时器 fd 上执行 lseek?解决方法? 他们不这样做是因为timer_fd 是特定于 Linux 的,并且不构成 POSIX 标准的一部分。因此,规范是 Linux 内核源代码。 Linux 不支持timer_fd 的查找。我已经告诉你解决方法,就是使用read 来读取相关字节。 是的,但这是唯一的方法吗?我不想在毫无意义的“read()”上损失一纳秒。 您可以修补内核以使其可搜索:-)

以上是关于在计时器 fd 上执行 lseek 时出错的主要内容,如果未能解决你的问题,请参考以下文章

VC中使用 setTimer 定时器时,可否当出现结果错误时跳出本次定时器触发的运行程序,执行下一次的定时触发?

创建计时器时出错

Linux 夏令时通知

linux c中select使用技巧——计时器(转)

启动 24 小时计时器,当 24 小时结束时通知用户

当线程在 main 上运行时,System.Windows.Forms 计时器不起作用