1

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

“如果文件不支持对lseek.

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

如果您有想法,我将非常感激:)

非常感谢你 !

4

2 回答 2

2

列举发生这种情况的案例。

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

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

使用错误。不相干。

EINVAL 无效。或者:生成的文件偏移量将为负数,或超出可搜索设备的末尾。

使用错误。不相干。

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

非常大的文件。相关的。

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

相关的。

ENXIO wherece 是 SEEK_DATA 或 SEEK_HOLE,并且当前文件偏移量超出文件末尾。

使用错误。不相干。

文件缩小了。相关的。


提出一个解决方案(您不会实施)来解决这个问题。

  • 溢出

    这可以通过切换到lseek64. 这将允许您处理最大为 8 exbibyte 的文件。(即 8,589,934,592 GiB。)

  • ESPIPE

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

  • 恩西奥

    拖尾文件固有地假定对被拖尾的文件进行的唯一修改是追加新行。此错误表明对文件执行了某种其他类型的更改。这是一个无法避免的错误。

    tail发出警告 ( file truncated) 并从新的 EOF 继续尾部。

于 2017-10-10T17:51:17.407 回答
0

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

于 2017-10-10T17:07:31.227 回答