【问题标题】:error while doing lseek on a timer fd在计时器 fd 上执行 lseek 时出错
【发布时间】: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) 有效。

【问题讨论】:

    标签: c posix flush


    【解决方案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()”上损失一纳秒。
    • 您可以修补内核以使其可搜索:-)
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2012-09-06
    • 2020-10-24
    • 2014-05-21
    相关资源
    最近更新 更多