c-替代lseek来跟踪文件(Posix)



我必须实现一个版本的tail(posix系统调用)。我使用了lseekpread。(我到达文件的末尾,然后搜索右偏移位置,然后用spread从这个位置读取,并写入stdout,直到文件的末尾)。但现在,我必须在没有lseek的情况下实现另一个版本的tail。问题如下:

"如果文件不支持对lseek的调用,则以前的版本不起作用。列举发生这种情况的情况。提出解决方案(您不会实现)来解决此问题。">

我不明白我们怎么能没有lseek。。。

如果你有主意,我将不胜感激:)

非常感谢!

引用发生这种情况的案例

为此,我们检查手册页以查看lseek可以返回哪些错误。

EBADF-fd不是打开的文件描述符。

使用错误。不相关。

EINVAL何处无效。或者:生成的文件偏移量将为负,或者超出可查找设备的末尾。

使用错误。不相关。

EOVERFLOW生成的文件偏移量不能用off_t表示。

非常大的文件。相关的

ESPIPE fd与管道、套接字或FIFO相关联。

相关。

ENXIO,其中是SEEK_DATA或SEEK_HOLE,并且当前文件偏移量超过文件末尾。

使用错误。不相关。

文件已收缩。相关的


提出解决方案(您不会实施)来解决此问题

  • EOVERFLOW

    这可以通过切换到lseek64来解决。这将允许您处理大小不超过8个字节的文件。(这是8589934592 GiB.)

  • ESPIPE

    管道、套接字和fifo实际上比普通文件更容易跟踪。当读取其中一个数据时,read将阻止等待更多数据,而不是在到达数据末尾时返回。没有理由采用用于普通文件的复杂搜索算法;可以简单地在循环中调用CCD_ 9。

  • ENXIO

    对文件进行尾序处理本质上假定对被尾序处理的文件所做的唯一修改是附加新行。此错误表示对文件执行了其他类型的更改。这是一个无法避免的错误。

    CCD_ 10发出警告(file truncated)并从新EOF进入尾部。

只需读取并丢弃数据,直到到达末尾,将最后几行保留在环形缓冲区中。

最新更新