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

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(使用前将#替换为@)

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

  • 使用内部构造函数实例化类

    我有一个类 其构造函数被定义为内部 这意味着我无法实例化它 虽然这可能有道理 但出于调试和研究目的 我仍然愿意做一次 是否可以通过反射来做到这一点 我知道我可以访问私有 内部成员 但是我可以调用内部构造函数吗 或者 由于构造函数没有做任何重
  • ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共构造函数吗?

    在我的两门课程中 看起来像这样 最少 using System using System Collections Generic using System Collections using System ComponentModel us
  • .NET Windows 服务中调用 C# 的 wait 的 I/O 回调是否可以不阻塞?

    我知道在 ASP NET 中 当使用 wait 时工作线程会返回到池中 而 I O 发生在后台 这对于可扩展性非常有用 我的 Windows 服务是一个套接字服务器 它使用 Begin End 样式的异步套接字 I O 混合我的魔法 我知道
  • 此插件导致 Outlook 启动缓慢

    我正在使用 C NET 4 5 开发 Outlook Addin 项目 但部署后 有时 Outlook 会禁用我的插件 并显示此消息 这个插件导致 Outlook 启动缓慢 我不知道我的插件出了什么问题 这只有很少的代码 并且ThisAdd
  • 当我尝试使用 AVX 功能时,Clang 生成错误

    我使用的是 Windows 10 使用 Clang 版本 5 最近安装 当我编译以下内容时 define AVX define AVX2 include
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 基于 C++ 范围的 for 循环

    尝试使用基于范围的 for 循环执行某些操作 可以使用常规的 for 循环来完成 如下所示 vector
  • AspNetCore.SignalR:无法启动未处于初始状态的连接

    我无法让 ASP NET Core SignalR 应用程序正常运行 我有这个服务器端代码 public class PopcornHub Hub private int Users public async Task BroadcastN
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern
  • fscanf 和 EOF 中的否定扫描集

    我的文件中有一个以逗号分隔的字符串列表 姓名 1 姓名 2 姓名 3 我想跳过所有逗号来阅读这些名字 我写了以下循环 while true if fscanf file my string 1 break 然而 它总是比预期多执行一次 给定
  • 使 C# 编译器相信执行将在成员返回后停止

    我认为目前这是不可能的 或者这是否是一个好主意 但这是我刚才正在考虑的事情 我使用 MSTest 对我的 C 项目进行单元测试 在我的一项测试中 我执行以下操作 MyClass instance try instance getValue
  • 向每个收件人发送一封包含不同内容的电子邮件(使用抄送字段)

    在你因为这个问题 毫无意义 和 不可能 而驳回之前 请听我说完 问题 我们在使用我们的系统发送的每封电子邮件中实施跟踪像素 即具有唯一 URL 的可下载 GIF 文件 这有助于我们跟踪电子邮件的打开情况 问题是 当我们抄送一些收件人时 跟踪
  • 如何在Linux上构建GLFW3项目?

    我已经使用 cmake 和 make 编译了 glfw3 和包含的示例 没有出现任何问题 开始编写我的第一个项目 作为 opengl 和 glfw 的新手 并且对 C 和 CMake 没有经验 我正在努力理解示例构建文件 甚至要链接哪些库和
  • 统一;随机物体移动[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在制作一款机器人战斗游戏 我希望敌人随机移动 然后有时会向敌人移动 我希望运动包含在其中的代码 else if avoid fal
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • 无效的模板相关成员函数模板推导 - 认为我正在尝试使用 std::set

    我有一个继承自基类模板的类模板 基类模板有一个数据成员和一个成员函数模板 我想从我的超类中调用它 我知道为了消除对成员函数模板的调用的歧义 我必须使用template关键字 我必须明确引用this在超级班里 this gt base mem
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • 计算两个日期之间的工作日数?

    在C 中 如何计算business 或工作日 两个日期之间的天数 我以前曾经遇到过这样的任务 并且我已经找到了解决方案 当可以避免的时候 我会避免列举其间的所有日子 这里就是这种情况 正如我在上面的一个答案中看到的那样 我什至没有提到创建一
  • 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning

    我们有asp net core webapi 我们添加了Microsoft AspNetCore Mvc Versioning and Swashbuckle拥有招摇的用户界面 我们将控制器指定为 ApiVersion 1 0 Route

随机推荐

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

    我怎样才能检索到这个词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永远不会返回少于请