我有一个案例,有两个进程作用于同一个文件 – 一个作为作者,一个作为读者.该文件是一行文本文件,编写器在循环中重写该行.读者读取该行.伪代码如下所示:

作家过程

char buf[][18] = {

"xxxxxxxxxxxxxxxx",

"yyyyyyyyyyyyyyyy"

};

i = 0;

while (1) {

pwrite(fd, buf[i], 18, 0);

i = (i + 1) % 2;

}

读者流程

while(1) {

pread(fd, readbuf, 18, 0);

//check if readbuf is either buf[0] or buf[1]

}

运行两个进程一段时间后,我可以看到readbuf是xxxxxxxxxxxxxxxxyy或yyyyyyyyyyyyyyyyxx.

我的理解是,对于大小为512字节的大小,写入将是原子的.但是从我的实验来看,看起来原子性只有16个字节.

man page没有说正常文件的原子性,它只提到512字节的管道原子性.

我用tmpfs和ext4尝试了这个,结果是一样的.使用O_SYNC,ext4写入变为原子并且我理解它,因为写入在它到达磁盘之前不会返回,但是O_SYNC对tmpfs(/ dev / shm)没有帮助.

解决方法:

POSIX不对read和write的原子操作提供任何最低保证,除了在管道上写入(其中写入高达PIPE_BUF(≥512)字节保证是原子的,但读取没有原子性保证).读取和写入操作以字节值描述;除了管道之外,与围绕单字节写操作的循环相比,写操作不提供额外的保证.

我不知道Linux会给出任何额外的保证,无论是16还是512.在实践中,我希望它依赖于内核版本,文件系统,以及可能还有其他因素,如底层块设备, CPU数量,CPU架构等

O_SYNC,O_RSYNC和O_DSYNC保证(synchronized I/O data integrity completion,在POSIX的可选SIO功能中读取和写入)不是您所需要的.它们保证在读取或写入系统调用之前将写入提交到持久存储,但不对在读取操作正在进行时启动的写入做出任何声明.

在您的方案中,读取和写入文件看起来不像正确的工具集.

>如果您只需要传输少量数据,请使用管道.不要过于担心复制:在大多数处理或上下文切换的规模上复制内存中的数据非常快.另外Linux非常适合优化副本.

>如果需要传输大量数据,则应该使用某种形式的内存映射:如果不需要磁盘支持,则为共享内存段;如果是,则为mmap.这并不能神奇地解决原子性问题,但可能会提高正确同步机制的性能.要执行同步,有两种基本方法:

>生产者将数据写入共享内存,然后向消费者发送通知,准确指出可用的数据.消费者仅根据请求处理数据.通知可以使用相同的信道(例如mmap msync)或不同的信道(例如管道).

>生产者将数据写入共享内存,然后刷新写入(例如msync).然后,生产者将一个众所周知的值写入一个机器字(sig_atomic_t通常会起作用,即使其原子性仅在信号上正式保证 – 或者,实际上是uintptr_t).消费者读取一个机器字,并且只有当该字具有可接受的值时才处理相应的数据.

标签:filesystems,linux,tmpfs

来源: https://codeday.me/bug/20190623/1270109.html

linux管道原子性写入,write(2)/ read(2)linux中进程之间的原子性相关推荐

  1. linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...

    操作系统实训(Linux)--习题解答.例题解析.实验指导-王红-实验实验7软中断及管道通信课案.ppt 实验7 软中断及管道通信 一.实验目的(1)掌握linux系统软中断通信的实现方法.(2)掌握 ...

  2. linux系统可以写入光盘吗_基于linux的国产操作系统,是真国产吗?

    嵌入式linux QQ交流群:175159209,欢迎爱好者加入交流技术问题! 导读 众所周知,国产系统发展到现在,已经有20多年了,虽然从市场覆盖率来看,并不太理想,按照Gartner 的统计数据, ...

  3. linux管道命令sudo,那些超有趣的Linux命令——第一弹

    8.盯着鼠标看的大眼睛 在命令行界面输入 sudo apt-get install x11-apps 然后输入 xeyes,回车,即可看到效果:一双紧盯着鼠标所在位置的大眼睛. 按ctrl+c退出. ...

  4. Linux入门-7 Linux管道、重定向以及文本处理

    Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...

  5. 安全狗漏洞通告|Linux kernel越界写入漏洞解决方案

    近日,安全狗应急响应中心监测到Linux操作系统厂商发布安全公告,Linux Netfilter存在越界写入漏洞.漏洞编号CVE-2022-25636. 漏洞描述 Linux kernel是美国Lin ...

  6. linux管道使用_如何在Linux上使用管道

    linux管道使用 Fatmawati Achmad Zaenuri/Shutterstock.comFatmawati Achmad Zaenuri / Shutterstock.com Use L ...

  7. Linux管道的原子性,管道机制

    管道指的是从一个进程连接数据流到另一个进程.它具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): 单 ...

  8. Linux管道的原子性,管道的原子性 linux写操作原子性

    从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题 限制管道的大小.实际上,管道是一个固定大小的缓冲区.在Linux中该换冲区的大小为一页,4k 使得他的 ...

  9. linux 管道 top,linux IPC总结——管道

    管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include int pipe(int fd ...

最新文章

  1. clickhouse 基础知识
  2. Git 看这一篇就够了
  3. Tomcat之Windows下安装
  4. 第三代计算机的内存使用是什么,lpddr3内存什么意思
  5. 生成BAPI的ALE接口
  6. linux系统下卸载rpm方式安装的mysql5.7.*
  7. GitHub 上四万 Star 大佬的BATT求职回忆
  8. 没有body怎么添加onload事件
  9. 反射java 入门_[java 基础]反射入门
  10. Linux设备驱动入门
  11. C4D 通过python导入外部.txt文件数据驱动物体
  12. gentoo linux 安装记录
  13. lync显示无法找到服务器,Lync 中的用户联系人照片未正确显示
  14. GTX1050 Ti(notebooks)+Ubuntu16.04上安装Cuda8.0
  15. Edge/IE浏览器主页被篡改为360导航的快捷解决方法
  16. 云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度
  17. 一起来做NES开发(1)
  18. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等...
  19. flash builder 编译配置
  20. 淘系端智能技术体系概述

热门文章

  1. ABAP 程序中退出操作(CHECK, EXIT, RETURN, LEAVE PROGRAM...)
  2. conscience ['kɔnʃəns]
  3. 武汉众邦银行的数字化升级秘诀:让每个业务⼈员都能自助式分析查询
  4. 红米note2移动4g在哪里显示无服务器,红米note2移动版能用联通4g吗?红米note2插联通卡用法介绍...
  5. matlab求解极限与倒数,matlab实验二__极限与导数
  6. java继承中构造方法_java之继承中构造方法总结(文字版)
  7. cytoscape要求的JAVA版本_微生物研究必备:Cytoscape绘制网络图(一)
  8. Python 列表与元组的速度比较
  9. python 归并排序,合并有序数组,逆序对个数
  10. python编程面试题