替代 lseek to tail 文件 (Posix)
Alternative to lseek to tail a file (Posix)
我必须实现一个版本的 tail
(posix 系统调用)。我使用 lseek
和 pread
完成了它。 (我到达文件末尾然后搜索正确的偏移位置,然后使用 pread 从该位置读取,并写入 stdout 直到文件末尾)。
但是现在,我必须在没有 lseek 的情况下实现另一个版本的 tail。问题如下:
"Previous version does not work if the file does not support calls to lseek
. Cite cases where this happens. Propose a solution (which you will not implement) to remedy this problem."
我不明白没有lseek
我们怎么办...
如果您有想法,我将不胜感激:)
非常感谢!
只需读取并丢弃数据,直到到达末尾,将最后几行保留在环形缓冲区中。
Cite cases where this happens.
为此,我们检查手册页以查看 lseek
可以 return 的错误。
EBADF fd is not an open file descriptor.
使用错误。不相关。
EINVAL whence is not valid. Or: the resulting file offset would be negative, or beyond the end of a seekable device.
使用错误。不相关。
EOVERFLOW The resulting file offset cannot be represented in an off_t.
非常大的文件。相关。
ESPIPE fd is associated with a pipe, socket, or FIFO.
相关。
ENXIO whence is SEEK_DATA or SEEK_HOLE, and the current file offset is beyond the end of the file.
使用错误。不相关。
文件缩小了。相关。
Propose a solution (which you will not implement) to remedy this problem.
EOVERFLOW
这可以通过切换到 lseek64
来解决。这将允许您处理最大为 8 exbibyte 的文件。 (即 8,589,934,592 GiB。)
ESPIPE
管道、套接字和 fifos 实际上比普通文件更容易跟踪。当从其中一个读取时,read
将阻止等待更多数据,而不是 returning 当您到达它们的末尾时。没有理由采用用于普通文件的复杂搜索算法;可以简单地在循环中调用 read
。
ENXIO
拖尾文件本身假定对被拖尾的文件所做的唯一修改是追加新行。此错误表明对文件执行了某种其他类型的更改。这是无法避免的错误。
tail
发出警告 (file truncated
) 并从新的 EOF 继续到 tail。
我必须实现一个版本的 tail
(posix 系统调用)。我使用 lseek
和 pread
完成了它。 (我到达文件末尾然后搜索正确的偏移位置,然后使用 pread 从该位置读取,并写入 stdout 直到文件末尾)。
但是现在,我必须在没有 lseek 的情况下实现另一个版本的 tail。问题如下:
"Previous version does not work if the file does not support calls to lseek
. Cite cases where this happens. Propose a solution (which you will not implement) to remedy this problem."
我不明白没有lseek
我们怎么办...
如果您有想法,我将不胜感激:)
非常感谢!
只需读取并丢弃数据,直到到达末尾,将最后几行保留在环形缓冲区中。
Cite cases where this happens.
为此,我们检查手册页以查看 lseek
可以 return 的错误。
EBADF fd is not an open file descriptor.
使用错误。不相关。
EINVAL whence is not valid. Or: the resulting file offset would be negative, or beyond the end of a seekable device.
使用错误。不相关。
EOVERFLOW The resulting file offset cannot be represented in an off_t.
非常大的文件。相关。
ESPIPE fd is associated with a pipe, socket, or FIFO.
相关。
ENXIO whence is SEEK_DATA or SEEK_HOLE, and the current file offset is beyond the end of the file.
使用错误。不相关。
文件缩小了。相关。
Propose a solution (which you will not implement) to remedy this problem.
EOVERFLOW
这可以通过切换到
lseek64
来解决。这将允许您处理最大为 8 exbibyte 的文件。 (即 8,589,934,592 GiB。)ESPIPE
管道、套接字和 fifos 实际上比普通文件更容易跟踪。当从其中一个读取时,
read
将阻止等待更多数据,而不是 returning 当您到达它们的末尾时。没有理由采用用于普通文件的复杂搜索算法;可以简单地在循环中调用read
。ENXIO
拖尾文件本身假定对被拖尾的文件所做的唯一修改是追加新行。此错误表明对文件执行了某种其他类型的更改。这是无法避免的错误。
tail
发出警告 (file truncated
) 并从新的 EOF 继续到 tail。