read() 系统调用实际读取的数据量

2023-11-30

假设我有一个文件,其文件描述符在 EOF 之前剩余的字节数超过 n 个字节,并且我调用了 n 个字节的 read() 系统调用。该函数是否保证将 n 个字节读入缓冲区?还是可以少读点?


The read系统调用保证读取您所要求的尽可能多的字符,除非它不能读取。但事实证明,存在如此多的例外情况——如此多的情况,它无法读取您要求的那么多字符——以至于基本上最终最安全的假设是任何给定的read调用可能不会读取您要求的那么多字符。我相信在编写代码时始终牢记这一点是一种很好的做法。

我系统上的手册页显示

如果描述符引用的普通文件在文件结尾之前还剩下那么多字节,则系统保证读取请求的字节数,但在其他情况下则不然。

因此,如果它不是普通文件,或者它是普通文件但没有足够的字符,则您得到的字符数将少于您要求的字符数。但在您询问的情况下,是的,应该保证您获得与您要求的数量完全相同的字符。

尽管如此,如果你发现自己可以选择假设read据称保证能够准确读取所请求的字符数,而不是承认它可能返回更少的字符数,我总是会编写代码以假设它可能返回更少的字符数。也就是说,如果您有一个类似的电话

r = read(fd, buf, n);

假设如果r大于 0,它必须恰好是n。您的代码必须能够处理r < n这种情况下,当它几乎在文件末尾时它会正常工作,所以除非你想有两个不同的代码路径(一个用于“正常”读取,一个用于最后一次读取),你不妨编写一段代码,可以处理r < n盒,并让它一直运行。

(另外,正如 Zan Lynx 在评论中提醒的那样,不要让代码注意到r < n,并推断文件结尾即将到来。等待r == 0在确定您已到达文件末尾之前。)

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

read() 系统调用实际读取的数据量 的相关文章

  • 如何在不需要设置 LD_LIBRARY_PATH shell 变量的情况下输入“cargo run”?

    我构建了一个 Rust 程序 通过 C 接口调用 C 函数 为了执行该程序 我必须运行 export LD LIBRARY PATH
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何为 C 分配的 numpy 数组注册析构函数?

    我想在 C C 中为 numpy 数组分配数字 并将它们作为 numpy 数组传递给 python 我可以做的PyArray SimpleNewFromData http docs scipy org doc numpy reference
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 私有模板函数

    我有一堂课 C h class C private template
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 使用 PDFBox 从 PDF 中读取某些 unicode 字符时出现问题

    我是 PDFBOX 新手 我正在阅读印地语的 PDF 文件 我在使用 PDFBox 从 PDF 中读取某些 unicode 字符时遇到问题 我想将字符串复制到 java 对象中 以便我可以处理它 我尝试了一些方法来读取文件 1 我尝试使用P
  • 如何在分组项目页面中每组之前插入图像列表?

    我目前正在使用 XAML 和 C 开发 Windows 8 应用程序 我开发了动态生成数据组的分组项目页面 我有一个社交媒体图标列表 我需要将其放在每个组标题旁边 但在左侧对齐 如屏幕截图所示 当我在 XAML 代码中添加列表时 它会在第一
  • Makefile c++11 支持

    我最近开始了一个 C 的小项目 我创建了一个简单的 Makefile CC g CFLAGS std c 0x I c VPATH src include vpath c src vpath h include TabooSearch ma
  • 如何在 Visual Studio 中连接到 MySQL 数据源

    我用MySQL 连接器 网络通过引用程序集 MySql Data dll 并传入连接字符串来连接到我的数据库MySqlConnection 我喜欢这样 因为我不需要安装任何东西 有没有办法在 Visual Studio 2010 中 选择数
  • 为什么我会遇到找不到类异常

    我在用DeferredTextImpl类和 eclipse 似乎没有抱怨它 但是当我运行我的项目时 我得到运行时异常 Class not found exception for DeferredTextImpl 当我搜索类文件时 我发现它在
  • 如何在 Objective C 中使用 AssetLibrary 检索视频的文件大小

    我想知道如何使用 AssetLibrary 检索视频的文件大小 有人能指出我正确的方向吗 或者可能有一些代码片段 这应该会让你走上正轨 看资产库框架参考 void logVideoSizes void assetEnumerator ALA
  • 为什么 xUnit Runner 找不到我的测试

    我有一个 xUnit net 测试如下 static class MyTestClass Fact static void MyTestMethod VS 2012 的 xUnit 插件说 没有发现可以运行的测试 TestDriven ne
  • ASP.NET MVC 中的 ELMAH 和异常管理

    我正在考虑从企业库中的异常管理应用程序块转移到新的 ASP NET MVC 站点 Scott Hansleman 在 ELMAH 上的帖子引起了我的注意 但我并不完全理解这种方法 通常 我会抑制一些异常 可恢复的异常 将它们记录在中央存储库
  • 在python中读取TDMS文件如何使用tdms info命令?

    我想知道Labview生成的tdms文件的内容是什么 按照此site 我用Python写 import numpy as np from nptdms import TdmsFile from nptdms import tdms read
  • 在外部网站上自动填写和提交表格

    我想知道一个人如何自动填写多个表格 使用bot local server 使用ajax或curl在外部站点 PHP 的多个页面上 例如一个网站www abc com index php有一个表格
  • 配置.vimrc时如何映射命令键?

    我使用 mac 我想配置 vimrc 例如 map
  • 模拟时间序列

    在最近的宏观经济预测在线课程中 有一个建模练习 y t 3 0 0 55 y t 1 e t where e t 定义为 et lt c 1 2138662 0 2854597 0 5902700 0 8285463 0 9954260 0
  • n 元函数的 Uncurry

    我有一个类型级别的数字 data Z deriving Typeable data S n deriving Typeable 和 n 元函数 来自固定向量包的代码 Type family for n ary functions type
  • 如何对 data.table 中的 .SD 列进行行明智操作

    虽然我之前已经弄清楚了这一点 但我仍然发现自己在 stackoverflow 上搜索 并且无法找到 这个语法 所以 我想对 data table 列的子集进行行明智操作 使用 SD and SDcols 我永远不记得手术是否需要sapply
  • Pandas 按组计算过去 n 天内发生的事件次数

    我有按 id 发生的事件表 如何计算过去 n 天内每种事件类型在当前行之前发生的次数 例如 事件列表如下 df pd DataFrame id 1 event day 2016 01 01 event type type1 id 1 eve
  • 将 lambda 参数传递给 include 语句

    我正在使用System Data Entity命名空间 因此我可以将 lambda 表达式传递给 Linq Include 方法 public ICollection
  • 容器绑定脚本尝试从侧边栏使用 google.script.run 运行函数时出现权限错误

    我尝试在电子表格上实现侧边栏 以获取用户输入以供我的脚本使用 我无法让它成功调用任何服务器端函数 我将谷歌文档中的一个简单脚本和我读过的几个 stackoverflow 问题放在一起 但我不断收到错误 它能够打印到控制台 但尝试调用时出错日
  • Eclipse 中的 Boost 链接错误

    我一直在尝试将 boost 的线程功能包含在 Ubuntu 上的 Eclipse C 项目中 但毫无结果 到目前为止的步骤 从 boost org 下载 boost configure with libraries system threa
  • 如何正确获取使用 flex-direction:column 显示的块的实际宽度?

    例如 HTML console log container width 600px as we defined in css console log list width 600px console log box eq 1 positio
  • read() 系统调用实际读取的数据量

    假设我有一个文件 其文件描述符在 EOF 之前剩余的字节数超过 n 个字节 并且我调用了 n 个字节的 read 系统调用 该函数是否保证将 n 个字节读入缓冲区 还是可以少读点 The read系统调用保证读取您所要求的尽可能多的字符 除