C read() 线程安全吗?

2023-11-30

我正在编写一个程序,其中多个线程可能同时从文件中读取。没有线程写入该文件,但它们可能各自将其内容复制到单独的内存段。

为了实现这一点,我需要使用一个 API,为我想要读取的文件提供一个文件描述符。我正在用 C 读取文件的块read功能。手册页说:“成功时,返回读取的字节数(零表示文件结尾),并且文件位置将按此数字前进。”不过,我找不到任何关于文件位置的前进是否是线程安全的明确信息。

假设我有线程 T1 和线程 T2 一次读取文件的 1 个字节。如果read()是线程安全的,我期望以下内容:

T1: read() => file position == 1
T2: read() => file position == 1
T1: read() => file position == 2
T2: read() => file position == 2
...

但我担心如果是not线程安全,那么可能会发生以下情况:

T1: read() => file position == 1
T2: read() => file position == 2
T1: read() => file position == 3
T2: read() => file position == 4
...

如果有帮助,每个线程将使用相同的文件描述符。换句话说,它是使用以下命令打开文件的 APIopen()。然后,正在读取文件的线程根据客户端请求获取该文件描述符。如果每个线程都存储自己的有关文件位置的信息,那么应该没问题。我只是找不到任何有关文件位置和位置的信息read()弄清楚它是什么。


read它本身是线程安全的,但这并不一定意味着您想要用它做的事情是线程安全的。根据 POSIX (2.9.7 线程与常规文件操作的交互):

当以下所有函数在常规文件或符号链接上操作时,在 POSIX.1-2008 中指定的效果中,彼此之间应是原子的:

...

(read在下面的列表中。)

除此之外,这意味着读取数据和前进当前文件位置相对于彼此而言是原子的,并且读取的每个字节将被读取一次。然而,还有其他一些考虑因素可能会让事情变得复杂,特别是:

  • 短读:read(fd, buf, n)不需要阅读n字节。它可以读取 1 到 1 之间的任何位置n字节,当您再次调用它来读取其余部分时,第二次读取相对于第一次读取不再是原子的。

  • 其他文件类型:POSIX仅保证原子性read适用于常规文件以及其他一些类型。 Linux 等特定系统probably有更强的保证,但我会保持谨慎。

最好使用pread函数(您可以在其中指定要读取的文件偏移量without必须寻找该位置,并且结果文件位置保持不变)或对文件访问执行锁定以避免此类问题。

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

C read() 线程安全吗? 的相关文章

  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var

随机推荐

  • Actionscript 到 java 源转换器

    有没有一个工具可以将actionscript3源代码转换为java源代码 我不久前遇到了这个页面 因为我也需要一个动作脚本到java转换器 我自己写了一篇 它非常简单 转换后需要手动调整 就像大多数此类转换器所做的那样 但它在自动化无聊的工
  • 让 Google Assistant 在特定状态下打开我的应用

    我正在尝试将我的 Android 应用程序与谷歌助手集成 我已经做了一些研究并浏览了一些教程 但它们只给我带来文本 卡片或音频响应 我需要的是谷歌助手根据谷歌助手的要求在特定状态下打开我的应用程序 例如 我会问谷歌助手我最喜欢的球队的下一场
  • 通过java代码插入一些数据时Sparql查询不更新

    我试图通过我的java代码将数据插入到加载到Fuseki服务器中的owl文件中 更新查询不会给出任何错误消息 但 owl 文件没有更新 我正在使用 jena 库并使用 java 代码实现 我的代码有什么问题 public boolean a
  • Python 发送带有 header 的 POST

    我尝试构建一个 python 脚本 该脚本发送带有参数的 POST 以提取结果 使用fiddler 我提取了我想要的返回的post请求 该网站仅使用 https POST Services GetFromDataBaseVersionned
  • 如何部署一个自建的Docker镜像来针对本地环境进行修改?

    快速回顾一下 docker 是一种为特定 Web 服务 运行环境 虚拟机编写代码或配置文件更改的方法 所有这些都来自 Linux 终端 文本文件的舒适范围 Docker 镜像是由 dockerfile 制作的代码层的保存点 或者可以从需要基
  • 如何在 TypeScript 中将类型声明为可为空?

    我有一个 TypeScript 界面 interface Employee id number name string salary number 我想做salary作为可为 null 的字段 就像我们在 C 中所做的那样 这可以在 Typ
  • 命令行上的 Android lint 缺少问题组(与 Android Studio 中提供的选项相比)

    当我通过 分析 gt 检查代码 在 Android Studio 中运行 lint 时 我可以从多种要查找的内容中进行选择 当我转到 lint 的命令行版本并列出所有要检查的可用内容 lint list 时 我得到的列表不包括我在 Andr
  • 如何在我的 WSGI apache 上为 Django 执行多个进程?

    我朋友说Django只有1个线程什么的 我必须编辑我的 000 default 才能添加更多进程吗 他建议 4 或 5 个 这到底是什么 我该怎么办 谢谢 我是菜鸟 Use the WSGIDaemonProcess指令将应用程序置于守护进
  • 装饰 Hex 函数以填充零

    我写了这个简单的函数 def padded hex i l given int i given len l hex result hex given int 2 remove 0x from beginning of str num hex
  • (;;) 和 while(); 有何用途? C 中的平均值 [重复]

    这个问题在这里已经有答案了 我正在查看一些示例代码 我看到有人这样做了 for 这相当于while 1 什么是while condition 做 我不明白放置背后的原因 代替 yes for 是一个无限循环
  • Pandas DataFrame:如何从自身引用行的多个子集?

    我想获得一个包含多个子集的数据框 例如 DataFrame data a 1 2 3 4 5 6 7 8 9 我想用 iloc 0 3 和 iloc 6 9 构建一个数据框 结果 DataFrame data a 1 2 3 6 7 8 目
  • C# 使用对象按值排序列表

    我正在尝试在 C 中创建对象的 有序 缓存 其中顺序由访问次数决定 我研究过 Dictionary SortedList 和 SortedDictionary 它们非常接近 但不太有我想要的东西 我想要一个包含所有以前缓存的项目的列表 这些
  • MFC 对话框控件的默认字体是什么?

    下图 放大 以便您更好地看到差异 显示了动态创建的编辑控件 上面的两个示例 和从对话框编辑器创建的编辑控件 下面的示例 之间的字体差异 如何使动态创建的 CEdit 控件的字体看起来像默认字体 下面的示例 我创建了如下 CEdit 控件 o
  • 使用 POI 的 XSSF 和 SAX(事件 API)读取 Excel 工作表

    我正在使用 POI 的 XSSF 和 SAX 事件 API 读取 Excel 工作表 Excel 工作表包含数千行用户信息 例如用户名 电子邮件 地址 年龄 部门等 我需要从 Excel 中读取每一行 将其转换为用户对象并将该用户对象添加到
  • 运行 ng build 时执行 JavaScript 文件

    我想每次运行时都在我的 Angular 应用程序中运行一个 JavaScript 文件ng build 更准确地说 我希望在构建过程之前执行此文件 以便它所做的更改出现在构建中 它是一个简单的脚本 用于读取应用程序版本及其依赖项并将它们写入
  • 无状态EJB实现接口注入失败

    野蝇8 2 0 我有一个StatelessEJB 和接口 Local Stateless public class Bean implements IBean Local public interface IBean 但我收到焊接错误 如果
  • UCS-2 Little Endian 到 UTF-8 的转换使文件中包含许多不需要的字符

    我有一个脚本 是在研究了许多不同的方法之后组合在一起的 我可以在 VBScript 中使用 ADODB 进行编码转换 Option Explicit Sub UTFConvert Dim objFSO objStream file file
  • 在 .NET 中获取执行 exe 路径的最佳方法是什么?

    从位于 c dir 的程序 a exe 中 我需要打开文本文件 c dir text txt 我不知道 a exe 位于何处 但 text txt 将始终位于同一路径中 如何从程序本身中获取当前正在执行的程序集的名称 以便我可以访问文本文件
  • 如果出现错误,如何更改图像来源?

    为什么下面的语句会抛出错误 Idea 显示来自普通 URL 的图像 如果未找到 404 则显示后备图像 完工 img height 200px class card img top 抛出错误 Parser Error Unexpected
  • C read() 线程安全吗?

    我正在编写一个程序 其中多个线程可能同时从文件中读取 没有线程写入该文件 但它们可能各自将其内容复制到单独的内存段 为了实现这一点 我需要使用一个 API 为我想要读取的文件提供一个文件描述符 我正在用 C 读取文件的块read功能 手册页