在计时器 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_fd
s 不可搜索。不是每个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 时出错的主要内容,如果未能解决你的问题,请参考以下文章