Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C lseek的替代方案,以跟踪文件(Posix)_C_Unix_Lseek - Fatal编程技术网

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,当前文件偏移量超出文件末尾

使用错误。不相关

文件缩小了。相关的


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

  • 溢流

    这可以通过切换到
    lseek64
    来解决。这将允许您处理大小不超过8字节的文件。(即8589934592吉布。)

  • 埃斯皮普

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

  • 恩西奥

    跟踪文件本质上假定对跟踪的文件所做的唯一修改是追加新行。此错误表示对文件执行了其他类型的更改。这是一个无法避免的错误

    tail
    发出警告(
    文件被截断
    ),并从新的EOF继续跟踪


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