我必须实现tail
版本(posix系统调用)。我是使用lseek
和pread
完成的。 (我到达文件的末尾然后我搜索正确的偏移位置,然后用pread从这个位置读取,并写入stdout直到文件的末尾)。
但是现在,我必须在没有lseek的情况下实现另一个版本的tail。问题如下:
"如果文件不支持对lseek
的调用,则以前的版本不起作用。引用发生这种情况的案例。提出一个解决方案(你不会实现)来解决这个问题。"
我不明白没有lseek
...
如果您有任何想法,我将非常感激:)
非常感谢!
答案 0 :(得分:2)
引用发生这种情况的案例。
为此,我们检查手册页以查看lseek
可以返回的错误。
EBADF fd不是一个打开的文件描述符。
使用错误。不相关。
EINVAL无效。或者:结果文件偏移量为负数,或者超出可搜索设备的末尾。
使用错误。不相关。
EOVERFLOW生成的文件偏移量不能用off_t表示。
非常大的文件。相关的。
ESPIPE fd与管道,套接字或FIFO相关联。
相关。
ENXIO是SEEK_DATA或SEEK_HOLE,当前文件偏移量超出文件末尾。
使用错误。不相关。
文件缩小。相关的。
提出解决方案(您不会实施)来解决此问题。
EOVERFLOW
这可以通过切换到lseek64
来解决。这将允许您处理最大8 exbibyte的文件。 (那是8,589,934,592 GiB。)
ESPIPE
管道,套接字和fifos实际上比普通文件更容易。从其中一个读取时,read
将阻止等待更多数据而不是在您到达目的时返回。没有理由采用用于普通文件的复杂搜索算法;可以简单地在循环中调用read
。
ENXIO
尾随文件本身就假定对被保存文件进行的唯一修改是添加新行。此错误表示对文件执行了其他一些更改。这是一个无法避免的错误。
tail
会发出警告(file truncated
),然后从新的EOF中继续发出警告。
答案 1 :(得分:0)
只需读取并丢弃数据,直到结束,将最后几行保留在环形缓冲区中。