linux管道原子性写入,write(2)/ read(2)linux中进程之间的原子性
我有一个案例,有两个进程作用于同一个文件 – 一个作为作者,一个作为读者.该文件是一行文本文件,编写器在循环中重写该行.读者读取该行.伪代码如下所示:
作家过程
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中进程之间的原子性相关推荐
- linux管道通信题目,操作系统实训(Linux)——习题解答、例题解析、实验指导-王红-实验实验7软中断及管道通信课案.ppt...
操作系统实训(Linux)--习题解答.例题解析.实验指导-王红-实验实验7软中断及管道通信课案.ppt 实验7 软中断及管道通信 一.实验目的(1)掌握linux系统软中断通信的实现方法.(2)掌握 ...
- linux系统可以写入光盘吗_基于linux的国产操作系统,是真国产吗?
嵌入式linux QQ交流群:175159209,欢迎爱好者加入交流技术问题! 导读 众所周知,国产系统发展到现在,已经有20多年了,虽然从市场覆盖率来看,并不太理想,按照Gartner 的统计数据, ...
- linux管道命令sudo,那些超有趣的Linux命令——第一弹
8.盯着鼠标看的大眼睛 在命令行界面输入 sudo apt-get install x11-apps 然后输入 xeyes,回车,即可看到效果:一双紧盯着鼠标所在位置的大眼睛. 按ctrl+c退出. ...
- Linux入门-7 Linux管道、重定向以及文本处理
Linux管道.重定向以及文本处理 1 Linux多命令协作:管道及重定向 管道和重定向 2 Linux命令行文本处理工具 文件浏览 基于关键字搜索-grep 基于列处理文本-cut 文本统计-wc ...
- 安全狗漏洞通告|Linux kernel越界写入漏洞解决方案
近日,安全狗应急响应中心监测到Linux操作系统厂商发布安全公告,Linux Netfilter存在越界写入漏洞.漏洞编号CVE-2022-25636. 漏洞描述 Linux kernel是美国Lin ...
- linux管道使用_如何在Linux上使用管道
linux管道使用 Fatmawati Achmad Zaenuri/Shutterstock.comFatmawati Achmad Zaenuri / Shutterstock.com Use L ...
- Linux管道的原子性,管道机制
管道指的是从一个进程连接数据流到另一个进程.它具有以下特点: 管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): 单 ...
- Linux管道的原子性,管道的原子性 linux写操作原子性
从本质上说,管道也是一种文件,但他又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题 限制管道的大小.实际上,管道是一个固定大小的缓冲区.在Linux中该换冲区的大小为一页,4k 使得他的 ...
- linux 管道 top,linux IPC总结——管道
管道 管道是unix ipc的最古老形式,是一种在内存中的特殊文件,只能在具有公共祖先的进程之间使用(即父子进程,兄弟进程). 管道由pipe函数创建 #include int pipe(int fd ...
最新文章
- clickhouse 基础知识
- Git 看这一篇就够了
- Tomcat之Windows下安装
- 第三代计算机的内存使用是什么,lpddr3内存什么意思
- 生成BAPI的ALE接口
- linux系统下卸载rpm方式安装的mysql5.7.*
- GitHub 上四万 Star 大佬的BATT求职回忆
- 没有body怎么添加onload事件
- 反射java 入门_[java 基础]反射入门
- Linux设备驱动入门
- C4D 通过python导入外部.txt文件数据驱动物体
- gentoo linux 安装记录
- lync显示无法找到服务器,Lync 中的用户联系人照片未正确显示
- GTX1050 Ti(notebooks)+Ubuntu16.04上安装Cuda8.0
- Edge/IE浏览器主页被篡改为360导航的快捷解决方法
- 云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度
- 一起来做NES开发(1)
- 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等...
- flash builder 编译配置
- 淘系端智能技术体系概述
热门文章
- ABAP 程序中退出操作(CHECK, EXIT, RETURN, LEAVE PROGRAM...)
- conscience ['kɔnʃəns]
- 武汉众邦银行的数字化升级秘诀:让每个业务⼈员都能自助式分析查询
- 红米note2移动4g在哪里显示无服务器,红米note2移动版能用联通4g吗?红米note2插联通卡用法介绍...
- matlab求解极限与倒数,matlab实验二__极限与导数
- java继承中构造方法_java之继承中构造方法总结(文字版)
- cytoscape要求的JAVA版本_微生物研究必备:Cytoscape绘制网络图(一)
- Python 列表与元组的速度比较
- python 归并排序,合并有序数组,逆序对个数
- python编程面试题