linux proc文件 write的原子性,Linux命令之write调用的原子性

linux命令是对Linux系统进行管理的命令。本文介绍的关于linux命令中write调用的原子性的详细描述,具体内容如下所述。

UNIX环境高级编程中关于原子操作的介绍,其中有一种情形是在文件尾端添加数据。

文中说,如果多个进程都需要将数据添加到某一文件,那么为了保证定位和写数据这两步是一个原子操作,需要在打开文件时设置O_APPEND标志,看到这里我们就会想,虽然保证了定位和写数据是一个原子操作,但是是否能够保证多个进程或线程写入的数据不会交错呢,比如A进程调用write(filedes1,"AAA",3),B进程调用write(filedes2,"BBBB",4)(其中filedes1和filedes2指向同一个文件),但是***文件中的数据是否有可能是AABBBAB,如果这个文件是一个管道或socket呢。

linuxman手册页中关于write调用的说明很不详细,并未说明写操作是否是原子的,所以我们有必要查找SingleUNIXSpecification(SUS)对write调用的说明,在SUS中对此调用的说明还是比较详细的。在继续讨论之前我们需要清楚内核在写文件之前会对该文件加锁,不管是否成功完成写操作,在返回之前都会解锁。

下面我们就以三种常见的文件根据SUS标准来讨论上面提出的这个问题:

1.普通文件

SUS中也没有说明在写普通文件时是否会保证是原子操作,但是它说明了write调用可能并不能完全把我们需要写入的数据写到文件中去,那么什么情况下可能少写数据呢?

SUS说明了两种情况:磁盘已满或则要写入的文件的大小超过了当前进程的文件大小限制。其实至少还有一种情况,那就是内核中的高速缓存不够用的时候,比如linux内核在发现高速缓存不够用的时候就只写入实际能够容下的数据然后返回。正是由于存在上述***一种情况,所以说按照APUE那种方法在linux下面写文件并不能保证我们的数据不会交错(不过我们可以根据write的返回值得知是否有发生交错的可能)。

其它的unix内核可能会在实现上不同于linux内核,他们可能在写之前就判断一下缓冲区是否足够容纳所有数据,如果是这种情况,写操作应该就是原子的;也可能写了一部分数据后才发现缓冲区不够用并让当前进程进入睡眠状态,此时内核如果解锁,那么在当前进程睡眠期间其它进程可能写了数据,如果不解锁,那么就是原子操作,其他进程不可能在这个时候写入数据。由上面的分析可知,正是由于SUS标准不太完整的标准,我们不能确定一定可以按APUE的方法来同时向同一个普通文件写数据。

如果我们非要在同一个文件中记录多个进程产生的数据,我们***采用unix日志系统采用的方法,用一个专用进程处理文件IO,其它进程把需要写的数据发送给这个专用进程,这样应该比多个进程同时写一个文件可靠和高效。

2.管道

SUS对管道的写操作说得更多也更明确,我们只需遵照其标准就可以了。对于write(pipefd,buf,nbyte),其要点如下:

如果nbyte<=PIPE_BUF,不管O_NONBLOCK是否设置,其写操作都是原子的,就是说多个进程都在此条件下同时写同一个管道不会引起数据交错。

如果nbyte>PIPE_BUF,是不能保证写操作是原子的,写入的数据可能与其他进程写入的数据交错。

3.socket

SUS中对于写socket并没有说很多,我们无法从标准中得知write是否保证写操作的原子性。我看了一下linux2.6.14内核关于tcp数据的写操作,发现它不是原子的,也从网上查到了这部分代码的作者(们)对这个问题的看法,他(们)认为对一个可能***阻塞的操作保证原子性是错误的。我们也只能姑且这么认为了。

补充:

对于用UNIX日志系统服务器的方法,连接端必须每个线程connect一次logsvr,这样才能保证发过来的日志数据不互相错乱,保证原子性;此时logsvr只要用reactor方法来处理每个线程的连接就好,把这些fd放到队列里轮流处理,写文件,也保证了写文件的原子性。

实际上日志服务器一般都是用UDP来完成的。

总结:

希望本文介绍的Linux命令中write调用的原子性的内容能够对读者有所帮助,更多有关linux系统的知识还有待于读者去探索和学习。

【编辑推荐】

【责任编辑:韩亚珊 TEL:(010)68476606】

点赞 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 命令行 迅雷替代,Mac/Linux下迅雷替代方案

还记得我两年前写的《DIY了家用NAS》吗&#xff1f;现在又带来新的升级啦。当初的NAS最多能使用Transmission来进行BT下载&#xff0c;那时就在想&#xff0c;如果能下载普通的http资源就好了。再进一步&#xff0c;有什么方案可以通吃所有下载方式呢&#xff1f; 记得那个时候…

linux好用的编译器,推荐几款Linux下比Notepad++好的编辑器软件

Notepad这一段又出风头了&#xff0c;好好的做你软件多好&#xff0c;非得参杂入政治。前两天开源文本编辑器 Notepad 发布了 7.8.1 版本&#xff0c;然后在该版本中作者居然摸黑中国&#xff0c;具体的内容请大家自行百度。而且这已经不是 Notepad 第一次这么干了&#xff01;…

linux下调用python脚本,Linux下QT调用Python脚本的解决方案,Qt,python,一种,解决办法

最近在做一个深度学习对图片中对象识别效果的检测工具&#xff0c;其主要功能就是将自己标注的图片与识别结果图片进行对比然后计算识别的准确等参数&#xff0c;并提供原图与结果图片的显示功能。脚本主要完成识别与计算功能&#xff0c;QT完成数据的整理显示与图片的显示。我…

linux获取bind返回值信息,v$sql_bind_capture 获取绑定变量信息

截取自v$sql_bind_capture 对于游标中定义的每一个绑定变量都会有视图中的一行对应。主要包含三个部分&#xff1a;指向父游标(hash_value, address)和子游标(hash_value, child_address)的信息,变量类型定义&#xff0c;变量的值(不包含复杂的值&#xff1a;LONG,LOB,和…

linux boost教程,Linux上安装使用Boost入门指导

获得boostboost分布只需要头文件的库使用boost建立一个简单的程序准备使用boost二进制文件库把你的程序链接到boost库1.获得boost解压2.boost分布boost_1_46_1.........................boost根目录boost/.....................................所有boost头文件libs/..........…

vps如何linux内核4.19,Linux kernel 4.19 RC1 发布,一个相当大的版本

原标题&#xff1a;Linux kernel 4.19 RC1 发布&#xff0c;一个相当大的版本Linus Torvalds今天发布了第一个候选版本(RC)&#xff0c;正式启动了即将推出的Linux 4.19内核系列的开发周期。自Linux 4.18内核系列推出以来已经过去两周了&#xff0c;因此下一个主要版本Linux ke…

linux下变量名长度,Linux中shell的变量介绍

Linux中shell的变量介绍发布时间&#xff1a;2020-06-24 16:20:39来源&#xff1a;亿速云阅读&#xff1a;112作者&#xff1a;元一这期内容当中的小编将会给大家带来有关Linux中shell的变量介绍&#xff0c;以专业的角度为大家分析和叙述&#xff0c;阅读完这篇文章希望大家可…

0 0/2 * * * ? linux文本含义,Linux基础2.0

1、硬盘使用的步骤识别硬盘 > 分区规划 > 格式化 > 挂载使用2、列出创建ext3、ext4、xfs、fat32文件系统的格式化工具及用法mkfs.ext3 分区设备路径mkfs.ext4 分区设备路径mkfs.xfs 分区设备路径mkfs.vfat -F 32 分区设备路径3、开机自动挂载配置文件及6个字段/etc/fs…

linux如何加载镜像,linux可以加载iso镜像文件到启动项吗

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼楼主的需求描述不清&#xff0c;不作评述。只说下关于楼上一些吧友提到的grub loopback设备可mount iso并读取其中文件的功能未读过grub1/2的源码&#xff0c;不太了解其实现原理&#xff0c;但从应用上来说&#xff0c;这个设备不…

10个linux awk文本处理经典案例,关于AWK的10个经典案例

1、分析访问日志(Nginx为例)日志格式&#xff1a; $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for" 统计访问IP次数&#xff1a; # awk…

arm linux 存储,linux arm的存储分布那些事

原标题&#xff1a;linux arm的存储分布那些事linux arm 内存分布总览上图是linux的arm的虚拟地址分布总览&#xff0c;我们按从低地址到高地址的顺序逐个描述&#xff0c;每项的描述包括如下的内容的组和&#xff1a;地址范围大小&#xff0c;虚拟转物理的接口函数&#xff0c…

linux恢复终端默认配置,以gnome-terminal为例,修改gnome3 的默认配置,

以gnome-terminal为例&#xff0c;修改gnome3 的默认配置&#xff0c;gnome连续几个版本的terminal默认配置文件都是同一个配置文件“b1dcc9dd-5262-4d8d-a863-c897e6d979b9”。这是因为gnome的developers编辑了这个配置文件并作为gnome-terminal的默认配置文件&#xff0c;用来…

c语言字符串文库总结,C语言程序设计入门:字符串函数

版权声明&#xff1a;以上文章中所选用的图片及文字来源于网络以及用户投稿&#xff0c;由于未联系到知识产权人或未发现有关知识产权的登记&#xff0c;如有知识产权人并不愿意我们使用&#xff0c;如果有侵权请立即联系&#xff1a;55525090qq.com&#xff0c;我们立即下架或…

vs写c语言能用scanf,【PAT编写代码时遇到的问题】vs中使用scanf(%c,x);

首先&#xff0c;为了在VS中使用scanf&#xff0c;可以在程序开头加上#pragma warning(disable:4996)昨天在编写程序的时候&#xff0c;突然发现在循环中使用scanf("%c",&x);的时候&#xff0c;发现结果很奇怪&#xff0c;只能读入和输出我所输入的数据的一半。后…

大数计算器概念c语言,用C语言求两个超大整数的和

用C语言求两个超大整数的和在生活中&#xff0c;我们经常需要计算非常大的数&#xff0c;但是任何一种计算器都有计算范围&#xff0c;一旦超过计算范围就会有精度的损失。或许有同学认为我们可以通过程序来解决&#xff0c;比如对于C语言来说&#xff0c;我们定义一个long lon…

3 5的二维数组C语言程序,C语言及程序设计提高例程-33 二维数组元素的引用

贺老师教学链接 C语言及程序设计提高 本课讲解输入输出二维数组元素#include int main(){int s[3][5], i, j;printf("Input 3*5 numbers\n");for (i0; i<3; i)for(j0; j<5; j)scanf("%d", &s[i][j]);for (i0; i<3; i){for(j0; j<5; j)pri…

android程序 幻灯片,Android:ViewPager制作幻灯片

public class MainActivity extendsActivity {//ViewPagerprivateViewPager viewpager;//幻灯片图片资源private int [] imgArray{R.drawable.view1,R.drawable.view2,R.drawable.view3};//图片数组private ArrayListviewlist;privateImageView imageView;//点点privateViewGro…

android获取图片方向并旋转,Android 判断imageview角度并旋转

/*** 读取照片exif信息中的旋转角度** return角度 获取从相册中选中图片的角度*/public static float readPictureDegree(String path) {int degree 0;try {ExifInterface exifInterface new ExifInterface(path);int orientation exifInterface.getAttributeInt(ExifInterf…

android键盘移动光标,在Android键盘上完成键

Jos Silva..12代替ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));尝试ic.performEditorAction(EditorInfo.IME_ACTION_GO);执行的操作应该是在EditorInfo上定义的操作,它将在方法onStartInputView上传递给您要在操作之间切换,请使用:(sEditorI…

android 远程桌面连接闪退,远程桌面一点连接就闪退,不能弹出输入账号密码窗口...

您好&#xff0c;感谢您在我们论坛发帖。首先&#xff0c;按照您的描述&#xff0c;正常情况下&#xff0c;您的客户端可以远程连接您的服务器&#xff0c;输入IP和端口之后&#xff0c;会弹出验证框&#xff0c;输入账户密码之后即可进入服务器的桌面。当出现问题时&#xff0…