C lseek的替代方案,以跟踪文件(Posix)
我必须实现一个版本的C lseek的替代方案,以跟踪文件(Posix),c,unix,lseek,C,Unix,Lseek,我必须实现一个版本的tail(posix系统调用)。我是用lseek和pread做的。(我到达文件的末尾,然后搜索正确的偏移位置,然后使用pread从该位置读取,并写入stdout,直到文件末尾)。 但是现在,我必须在没有lseek的情况下实现另一个版本的tail。问题如下: “如果文件不支持调用lseek,则以前的版本不起作用。请列举发生这种情况的案例。提出解决方案(您将不实施)以解决此问题。” 我不明白没有lseek我们怎么办 如果你有什么想法,我将非常感激:) 多谢各位 只需读取并丢弃数据
tail
(posix系统调用)。我是用lseek
和pread
做的。(我到达文件的末尾,然后搜索正确的偏移位置,然后使用pread从该位置读取,并写入stdout,直到文件末尾)。
但是现在,我必须在没有lseek的情况下实现另一个版本的tail。问题如下:
“如果文件不支持调用lseek
,则以前的版本不起作用。请列举发生这种情况的案例。提出解决方案(您将不实施)以解决此问题。”
我不明白没有lseek我们怎么办
如果你有什么想法,我将非常感激:)
多谢各位 只需读取并丢弃数据,直到到达末尾,将最后几行保留在环形缓冲区中 举出发生这种情况的案例 为此,我们检查手册页以查看
lseek
可以返回哪些错误
EBADF fd不是打开的文件描述符
使用错误。不相关
EINVAL where无效。或者:生成的文件偏移量为负,或者超出可查找设备的末端
使用错误。不相关
EOVERFLOW结果文件偏移量不能用off\t表示
非常大的文件。相关的
ESPIPE fd与管道、插座或FIFO相关联
相关的
ENXIO是SEEK_DATA或SEEK_HOLE,当前文件偏移量超出文件末尾
使用错误。不相关
文件缩小了。相关的
提出一个解决方案(您不会实施)来解决此问题
- 溢流
这可以通过切换到
来解决。这将允许您处理大小不超过8字节的文件。(即8589934592吉布。)lseek64
- 埃斯皮普
管道、套接字和FIFO实际上比普通文件更容易跟踪。当从其中一个读取数据时,
将阻止等待更多数据,而不是在到达数据末尾时返回。没有理由采用用于普通文件的复杂搜索算法;可以在循环中简单地调用read
read
- 恩西奥
跟踪文件本质上假定对跟踪的文件所做的唯一修改是追加新行。此错误表示对文件执行了其他类型的更改。这是一个无法避免的错误
发出警告(tail
),并从新的EOF继续跟踪文件被截断