问题标签 [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.
c - 在 MTD 上超越 EOF
手册页lseek()
说:
lseek() 允许将文件偏移量设置为超出文件末尾(但这不会改变文件的大小)。如果稍后在此时写入数据,则后续读取间隙(“洞”)中的数据将返回空字节('\0'),直到数据实际写入间隙。
在错误部分它说:
EINVAL无效。或者:生成的文件偏移量将为负数,或超出可搜索设备的末尾。
我不确定如何解释lseek
手册页,因为它没有提到 MTD。
假设MTD
已经以读写权限打开,当MTD 寻求过去的EOFlseek()
时,将如何响应?whence
SEEK_SET
linux - 什么是 lseek 的 linux 内核等价物?
我正在用 linux 内核模块编写一个 linux 设备驱动程序,我想处理用户在文件大小之后写入的情况。我看到有 vfs_lseek(),但它需要一个 fd,我只有 struct* 文件指针。我可以在内核模块中使用等效的 lseek 吗?
c - C 中的 lseek 是否对数据结构进行了一些修改?
我知道打开和关闭修改OS通用文件表,进程文件表和inode表。但是 lseek 修改了什么以及如何修改?
c - 使用 O_DIRECT 打开的文件中的 seek() 和 read()
我正在尝试往返文件seek
,read
我的目标是所有读取都直接来自磁盘。为了做到这一点,我open()
将文件与O_DIRECT
,lseek()
到所需的偏移量,并尝试read()
从磁盘中删除一个块。从磁盘读取时遇到错误:
当我在打开文件时删除 O_DIRECT 时,错误消失了。从阅读手册页:
这是否意味着 lseek 不支持 O_DIRECT?我们如何寻找不同的磁盘偏移量并直接从磁盘读取?
c - lseek() 的偏移量和大块设备
为了好玩和练习,我尝试创建一个将位模式写入硬盘驱动器特定扇区的程序。我的想法是能够提供特定的扇区号(以 LBA 格式)并让程序尝试写入它然后从中读取并确定写入和读取是否相同。
到目前为止,该程序有效。但是,在处理非常大的驱动器(因此非常大的偏移量)时,我遇到了问题。
例如,从头寻找到 LBA 1306638144(即寻找到 1306638144*512)会溢出 seek 的off_t
。
我尝试通过迭代增加SEEK_CUR
并避免传递大量数字来解决这个问题。
有没有适当的方法来处理这个问题?lseek() 是执行此操作的错误函数吗?有没有更好的方法来寻找特定的部门?
最好的祝福!
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> 修复
c - 为什么 lseek 不改变价值?(C)
输出:
不file
应该设置为52
?
c - C lseek 行为不端
我试图编写一个模拟tail
C 中行为的程序。在文件中搜索“/n”字符时,我从 lseek 得到一个奇怪的行为。这是相关的代码:
运行这段代码给了我那些 printf 语句:
所以它四次进入 EOF 并在 EOF 之前再次读取最后一个 '\n',给我错误的结果。
用以下方式切换 while 主体:
给了我预期的行为。
所以,我想知道,为什么我的第一个身体被打破了?
编辑:固定格式和无关紧要的事情
c - C - 使用定义表达式的 lseek 后读取错误
我有一个二进制文件,我需要从中读取时间戳。特别是,我正在尝试阅读最后一条记录。每条记录长 24 个字节,时间戳在前 8 个字节。这是我写的代码:
但这给了我以下输出:
偏移量:117384 rGmte:0
这是错误的。如果我用固定值 24 替换定义中的表达式,我会得到正确的输出:
偏移量:117384 rGmte:1606314900
另请注意,两种情况下的偏移量相同,但读取的值不同。任何想法?
c - `lseek` 如何帮助确定文件是否为空?
我正在查看GNU coreutils的源代码,特别是圆形检测。cat
他们正在比较设备和 inode 并且工作正常,但是如果输入为空,他们允许输出作为输入的额外情况。查看代码,这是必须的lseek (input_desc, 0, SEEK_CUR) < stat_buf.st_size)
部分。我阅读了从 中找到的联机帮助页和讨论git blame
,但我仍然不太明白为什么需要此调用lseek
。
这是如何cat
检测的要点,如果它会无限耗尽磁盘(请注意,为简洁起见,还删除了一些错误检查,完整的源代码在上面链接):
我有两种可能的解释,但似乎都有些奇怪。
- 根据某些标准(posix),文件可能是“空的”,尽管它仍然包含一些信息(用 计数
st_size
)和lseek
/或open
通过默认偏移来尊重这些信息。我不知道为什么会这样,因为空意味着空,对吧? - 这种比较确实是两个条件的“聪明”组合。首先这对我来说是有意义的,因为如果
input_desc
会STDIN_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