问题标签 [lseek]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
229 浏览

c - 在 MTD 上超越 EOF

手册页lseek()说:

lseek() 允许将文件偏移量设置为超出文件末尾(但这不会改变文件的大小)。如果稍后在此时写入数据,则后续读取间隙(“洞”)中的数据将返回空字节('\0'),直到数据实际写入间隙。

在错误部分它说:

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

我不确定如何解释lseek手册页,因为它没有提到 MTD。

假设MTD已经以读写权限打开,当MTD 寻求过去的EOFlseek()时,将如何响应?whenceSEEK_SET

0 投票
0 回答
407 浏览

linux - 什么是 lseek 的 linux 内核等价物?

我正在用 linux 内核模块编写一个 linux 设备驱动程序,我想处理用户在文件大小之后写入的情况。我看到有 vfs_lseek(),但它需要一个 fd,我只有 struct* 文件指针。我可以在内核模块中使用等效的 lseek 吗?

0 投票
0 回答
47 浏览

c - C 中的 lseek 是否对数据结构进行了一些修改?

我知道打开和关闭修改OS通用文件表,进程文件表和inode表。但是 lseek 修改了什么以及如何修改?

0 投票
1 回答
273 浏览

c - 使用 O_DIRECT 打开的文件中的 seek() 和 read()

我正在尝试往返文件seekread我的目标是所有读取都直接来自磁盘。为了做到这一点,我open()将文件与O_DIRECT,lseek()到所需的偏移量,并尝试read()从磁盘中删除一个块。从磁盘读取时遇到错误:

当我在打开文件时删除 O_DIRECT 时,错误消失了。从阅读手册页:

这是否意味着 lseek 不支持 O_DIRECT?我们如何寻找不同的磁盘偏移量并直接从磁盘读取?

0 投票
1 回答
130 浏览

c - lseek() 的偏移量和大块设备

为了好玩和练习,我尝试创建一个将位模式写入硬盘驱动器特定扇区的程序。我的想法是能够提供特定的扇区号(以 LBA 格式)并让程序尝试写入它然后从中读取并确定写入和读取是否相同。

到目前为止,该程序有效。但是,在处理非常大的驱动器(因此非常大的偏移量)时,我遇到了问题。

例如,从头寻找到 LBA 1306638144(即寻找到 1306638144*512)会溢出 seek 的off_t

我尝试通过迭代增加SEEK_CUR并避免传递大量数字来解决这个问题。

有没有适当的方法来处理这个问题?lseek() 是执行此操作的错误函数吗?有没有更好的方法来寻找特定的部门?

最好的祝福!

0 投票
1 回答
98 浏览

c - lseek SEEK_END 没有得到最后一个字符

固定(见最终编辑)

我正在尝试使用 lseek 获取文件的最后一个字符并读取。我要打开的文件是这样的(最后没有'\n'):

我希望输出为“d”。出于某种原因,执行 lseek(file, -1, SEEK_END) 似乎不起作用。但是,在它工作之后添加一个冗余的 lseek(file, position, SEEK_SET) 。我的代码:

给出一个输出:

有谁知道发生了什么?


编辑:我已经尝试 lseek(file, 0, SEEK_CUR) 代替 lseek(file, position, 0) 并且它不起作用,尽管它仍然返回 42。

编辑 2:删除了幻数。


最终编辑:通过添加 #include <unistd.h> 修复

0 投票
3 回答
142 浏览

c - 为什么 lseek 不改变价值?(C)

输出:

file应该设置为52

0 投票
1 回答
80 浏览

c - C lseek 行为不端

我试图编写一个模拟tailC 中行为的程序。在文件中搜索“/n”字符时,我从 lseek 得到一个奇怪的行为。这是相关的代码:

运行这段代码给了我那些 printf 语句:

所以它四次进入 EOF 并在 EOF 之前再次读取最后一个 '\n',给我错误的结果。

用以下方式切换 while 主体:

给了我预期的行为。

所以,我想知道,为什么我的第一个身体被打破了?

编辑:固定格式和无关紧要的事情

0 投票
1 回答
73 浏览

c - C - 使用定义表达式的 lseek 后读取错误

我有一个二进制文件,我需要从中读取时间戳。特别是,我正在尝试阅读最后一条记录。每条记录长 24 个字节,时间戳在前 8 个字节。这是我写的代码:

但这给了我以下输出:

偏移量:117384 rGmte:0

这是错误的。如果我用固定值 24 替换定义中的表达式,我会得到正确的输出:

偏移量:117384 rGmte:1606314900

另请注意,两种情况下的偏移量相同,但读取的值不同。任何想法?

0 投票
1 回答
333 浏览

c - `lseek` 如何帮助确定文件是否为空?

我正在查看GNU coreutils的源代码,特别是圆形检测。cat他们正在比较设备和 inode 并且工作正常,但是如果输入为空,他们允许输出作为输入的额外情况。查看代码,这是必须的lseek (input_desc, 0, SEEK_CUR) < stat_buf.st_size)部分。我阅读了从 中找到的联机帮助页和讨论git blame,但我仍然不太明白为什么需要此调用lseek

这是如何cat检测的要点,如果它会无限耗尽磁盘(请注意,为简洁起见,还删除了一些错误检查,完整的源代码在上面链接):

我有两种可能的解释,但似乎都有些奇怪。

  1. 根据某些标准(posix),文件可能是“空的”,尽管它仍然包含一些信息(用 计数st_size)和lseek/或open通过默认偏移来尊重这些信息。我不知道为什么会这样,因为空意味着空,对吧?
  2. 这种比较确实是两个条件的“聪明”组合。首先这对我来说是有意义的,因为如果input_descSTDIN_FILENO并且不会有文件传送到stdin,lseek会失败ESPIPE(根据手册页)并返回-1。那么,整个语句将是lseek(...) == -1 || stat_buf.st_size > 0. 但这不可能是真的,因为只有在设备和 inode 相同的情况下才会进行此检查,并且只有在 a) stdin 和 stdout 指向相同的 pty 时才会发生这种情况,但随后out_isreg会是false或者 b) stdin 和 stdout 指向同一个文件,但随后lseek无法返回-1,对吗?

我还编写了一个小程序,可以打印出返回值和errno重要部分,但对我来说没有什么突出的:

因此,我的研究没有触及我的最终问题:如何从源代码lseek中确定此示例中的文件是否为空?cat