2017-10-10 57 views
1

我不得不实施tail(posix系统调用)的一个版本。我使用了lseekpread。 (我到达文件末尾,然后搜索正确的偏移位置,然后使用pread从此位置读取,并写入stdout直到文件末尾)。 但是现在,我必须实现另一个没有lseek的版本。现在的问题如下:替代lseek尾部文件(posix)

“如果文件不支持调用lseek,那么以前的版本不起作用。引用发生这种情况的情况。提出一个解决方案(你不会实现)来解决这个问题。

我不明白,我们怎么能不lseek做...

如果你有一个想法,我会很感激:)

非常感谢您!

+1

将其读取到您需要的位置并丢弃读取的数据。 –

回答

2

举出发生这种情况的情况。

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

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

使用错误。不相关。

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

使用错误。不相关。

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

非常大的文件。相关。

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

相关。

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

使用错误。不相关。

文件收缩。相关。


提出一个解决方案(你将不执行),以解决这个问题。

  • EOVERFLOW

    这可以通过切换到lseek64来解决。这将允许您使用最多8个exbibyte大小的文件。 (这是8589934592吉布)

  • ESPIPE

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

  • ENXIO

    拖尾文件固有地假设进行的唯一修改被于被尾该文件是新线的追加制成。此错误表示对该文件执行了其他一些更改。这是一个无法避免的错误。

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

0

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