从常规文件读取:阻止或返回更少的数据?

2023-12-25

是否有可能read to

  • block
  • 返回的数据少于请求的数据

从常规文件读取时,不包括:

  • 请求超过 SSIZE_MAX 的数据
  • 读取超出 EOF 的内容
  • 信号中断

read(3)表明,排除上述条件,从常规文件读取时read永远不会返回少于请求的字节数。

如果文件中剩余的字节数小于 nbyte,如果 read() 请求被信号中断,或者如果文件是管道、FIFO 或特殊文件并且少于 nbyte,则返回的值可能小于 nbyte nbyte 字节立即可供读取。

然而,这个答案 https://stackoverflow.com/a/10179298/2626865提出一个假设,其中read如果内核希望优先考虑其他 I/O,则返回的字节数可能少于请求的字节数。虽然是假设,但要点是,在任何条件下都无法读取预期返回与请求的数据完全相同的数据。因此,即使上述三个条件(SSIZE_MAX、EOF、中断)不适用,使用它也绝不安全read在常规文件上而不检查返回值:

// all blockable signals have been ignored
// 10 is guaranteed less than SSIZE_MAX
// file size is known, access is locked
if (read(fd_of_big_reg_file_with_zero_offset, buf, 10) < 0) {
    // so all we have to do is handle errors
}

此外,我从未经历过对常规文件的读取被阻止,但我认为在发生可恢复的 I/O 错误时这是可能的,例如需要多次重新读取的坏块。


进行简短读取的一种方法(除了您问题中提到的情况之外)是在读取过程中发生 I/O 错误。

例如,假设您有一个大小为 1024 的常规文件,占用两个 512 字节的扇区。您不知道的是,第二个扇区已损坏并且无法读取。打开文件并执行read(fd, buf, 1024)将返回 512 并且不会设置errno。如果你尝试阅读again,你得到的返回值为-1 and errno = EIO.

我能够使用设备映射器在 Linux 上测试这一点error功能。

由于您的程序无法执行任何操作来排除 I/O 错误的可能性,这意味着永远不能安全地假设来自read必须意味着您读取了请求的尽可能多的字节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从常规文件读取:阻止或返回更少的数据? 的相关文章

随机推荐

  • 获取两个圆括号之间的文本

    我怎样才能检索到这个词my在 JavaScript 中使用正则表达式从下面句子中的两个圆括号之间 这是 我的 简单文本 console log This is my simple text match 1 正在打开大括号 子表达式的开始 除
  • 将CSS属性设置为html标签是否正确?

    我实际上可以设置 html 标签的背景颜色 我不知道这是可能的 我不明白它在逻辑上是否正确 我认为主体是唯一负责包含和 第一个 呈现标签的人 我以为 html 标签只是一个包装器 但它看起来不同 所以 html标签到底代表什么 为什么我可以
  • 按时间间隔运行宏的代码?

    如何设置宏在特定时间运行 然后以设定的时间间隔运行 我希望它在每小时的顶部运行 因此我想在上午 07 00 启动它 然后在我希望它再次运行后每小时运行一次 这是代码 Sub Refresh All Refresh All Macro Key
  • tryCatch 函数适用于大多数不存在的 URL,但在(至少)一种情况下不起作用

    亲爱的 Stackoverflow 用户 我正在使用 R 从 今日心理学 中抓取一些心理治疗师的资料 这样做是为了锻炼和学习更多有关网络抓取的知识 我是 R 新手 我必须接受这种紧张的培训 这将有助于我完成未来的项目 这意味着我可能并不确切
  • 用于查询的 iTunes 搜索 API 页码

    有什么方法可以获取搜索查询下一页的结果吗 当我给出页面参数时 我从 iTunes 得到相同的结果 and 给出相同的输出 提供页面参数适用于客户评论 有什么办法可以得到下一页的结果吗 根据API文档 没有办法 但我发现了很多有用的答案 但A
  • “Uploader”必须是 FileUploader 的实例

    我提到了这个 https github com nervgh angular file upload tree version 3 0 0 alpha https github com nervgh angular file upload
  • 扩展方法调用不会编译,但对相同代码的静态方法调用会编译

    库 A 使用 C 扩展方法调用库 B 我从 C 编译器中收到一个奇怪的错误 类型 System Windows Forms Control 是在程序集中定义的 没有被引用 您必须添加对程序集的引用 System Windows Forms
  • 从 docker 容器内部和外部访问预先指定的 get URL 的 minio 对象

    我使用以下 docker compose yml 文件来部署 FastAPI MongoDB Minio docker 容器 version 3 7 services db image mongo latest container name
  • PostgreSQL 复制策略

    现在 我们使用 PostgreSQL 8 3 在 Linux 上 作为 Ruby on Rails Web 应用程序的数据库后端 考虑到在 PostgreSQL 数据库上我们积极使用行级阻塞和 PL PGSQL 我们可以使用什么来保护我们的
  • 无法通过 ssh 连接我的 ubuntu 服务器。 “kex_exchange_identification:横幅行包含无效字符”

    当我想使用VScode远程SSH连接我的服务器时 提示以下错误 kex exchange identification 横幅行包含无效字符 一开始我以为是我的VSCode的错误 但是我在PowerShell中尝试了最简单的SSH命令 它仍然
  • 指示服务器请求失败的最佳实践方法?

    我正在编写一个连接到服务的 API 该服务要么返回简单的 成功 消息 要么返回 100 多种不同类型的失败消息之一 最初我想编写向该服务发送请求的方法 这样如果成功 该方法不会返回任何内容 但如果由于某种原因失败 则会抛出异常 我不太介意这
  • alembic 并获取最后插入的值

    我正在使用 alembic 来管理我的数据库结构 使用 id 作为整数和主键添加表后 id 列将成为自动增量列 如何查询升级脚本中的数据 以便确保获得正确的 ID 我知道在本例中为 1 我知道怎么做 creating the table o
  • C# 中的委托问题

    在下面的程序中 DummyMethod 总是打印 5 但是如果我们使用注释代码 我们会得到不同的值 即 1 2 3 4 有人可以解释为什么会发生这种情况吗 delegate int Methodx object obj static int
  • Excel - 从数据透视表中提取列并将其显示在常规表中

    我想从数据透视表中的特定列中提取数据并将其显示在常规 Excel 表中 这可能吗 当数据透视表中有新数据时 它应该自动更新 我之前编写了一些代码将表从属于数据透视表 以便数据透视表尺寸或位置的任何更改都将反映在阴影表的尺寸和位置中 这有效地
  • 检测 X11 根窗口中的修改键释放

    总体目标就像 Windows 的 Alt Tab 所以我将使用这些键进行解释 我想 按 Alt gt 按 Tab gt 弹出窗口出现 gt 按住 Alt 的任何时候按 Tab gt 释放 Alt gt 弹出窗口消失 我无法检测到最终的 Al
  • Delphi EOutOfResources(GDI错误)

    我编写了一个应用程序 其中偶尔会出现 EOutofResources 错误 将 TBitmap32 保存到流时 由 Graphics 单元的 GD IError 方法引发 据我所知 它可能来自 gdi 限制或堆限制 我知道该进程的默认限制为
  • 在executeBatch()之后我需要一个connection.commit()吗?

    我必须检查同事的代码 我偶然发现了这段代码 private void pdate JdbcTemplate jdbcTemplate List
  • Microsoft Visual Studio 2019:无法打开项目文件。无法找到 .NET SDK

    我刚刚升级了我的视觉工作室2019到最新版本16 8 3突然间 我无法加载任何 C 项目 并且所有 NET Core 项目都出现以下错误 无法打开项目文件 无法找到 NET SDK 检查它是否已安装以及指定的版本 global json 如
  • PhoneGap 中可以集成支付网关吗?

    我想在 Android 和 IOS 的 PhoneGap 应用程序中实现支付网关集成 请帮助我执行正确的步骤 PhoneGap PayPal iPhone 插件 Here is link of PayPal Plugin for Phone
  • 从常规文件读取:阻止或返回更少的数据?

    是否有可能read to block 返回的数据少于请求的数据 从常规文件读取时 不包括 请求超过 SSIZE MAX 的数据 读取超出 EOF 的内容 信号中断 read 3 表明 排除上述条件 从常规文件读取时read永远不会返回少于请