Linux编程--文件原子操作

当多个进程同时访问一个文件的时候,普通的write/read在执行的时候,无法保证操作的原子性,可能会导致文件被污染,达不到预期的结果。

任何一个需要多个函数调用的操作都不可能是原子操作,因为在两个函数调用间,内核可能会将进程挂起执行另外的进程。

如果想要避免这种情况的话,则需要使用pread/pwrite函数

ssize_t pread(int fd ,void *buffer ,size_t size,off_t offset) 返回真正读取到的字节数,offset是指的从文件开始位置起的offset个字节数开始读。其余的参数与read无异。

PS: pread是无法中断的原子操作,无法中断它的定位和读取操作 pread读取过后的文件偏移量不会发生改变

同理pwrite也是一样的

而在文件创建的时候也是一样的,当需要做文件创建同步的时候,我们需要在O_CREATE的时候,加上O_EXCL标志位,当已经创建过的话,会返回fd,否则返回错误

dup与dup2函数

int dup( int filedes): 传入一个文件描述符,返回当前可用的最小文件描述符。

int dup2(int filedes,int filedes2): 传入文件描述符,以及新的文件描述符,如果新的文件描述符所指向的文件已经打开,则会强行将其关闭后,将该文件描述符指向到已存在的文件描述符。 如果filedes和filedes2指向同一个文件,则不做任何处理,直接返回filedes2,不会关闭文件

新返回回来的filedes2会共享filedes的文件状态标识,文件偏移量等等信息。因为它们的文件指针会指向文件表的同一个位置。只是fd不一样而已。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏蓝天

快速上手,协程剖析

协程也叫微线程,英文名称为coroutine。一个进程可以有多个线程,一个线程可以有多个协程,这是协程和线程间的关系。不同的是,线程由系统调度,但协程需要...

991
来自专栏一个默默无闻的工程师的日常

openstack icehouse负载均衡配置

1704
来自专栏xcywt

《Linux命令行与shell脚本编程大全》第十五章 呈现数据

15.1 理解输入和输出 现在知道两种显示脚本输出的方法 1)在显示器屏幕上显示 2)将输出文件重定向到文件中 15.1.1 标准文件描述符 Linux系统将每...

2166
来自专栏Laoqi's Linux运维专列

Find命令详解整理

Find locate 搜索命令 使用: 1 #yum install -y mlocate   安装 updatedb  生...

3216
来自专栏云数据库

MyLoader原理简介

提起mydumper,首先让人想到的是相对于mysqldump的多线程逻辑备份工具,而往往会忽略同是mydumper项目下的myloader工具。myloade...

2447
来自专栏pangguoming

两台centos之间传送文件

最近在CentOS系统中(主机A)读数据。由于A主机只是作为数据读取,具体的Deep Learning 实验,需要在主机B( CentOS )中进行,需要将主机...

1403
来自专栏菩提树下的杨过

ssh远程执行目标机器上的命令

一句话: ssh -t -p 端口号 用户名@远程机器IP '远程机器上的命令完整路径' 例如:   ssh -t -p 22 yangjunming@dev ...

20910
来自专栏奔跑的蛙牛技术博客

Java虚拟机加载类文件大全-精细版

类加载器存在父子关系 例如系统类加载器要加载java.util.ArrayList,首先要求扩展类进行加载,然后扩展类加载器要求引导类加载器进行加载。

721
来自专栏杨建荣的学习笔记

实用的top命令(r3笔记54天)

对于系统级的监控来说,top命令是实用而高效的瑞士军刀。相比vmstat,sar来说提供的是实时的进程信息,对于监控性能,排查问题是很高效的。而且提供了交互式的...

2755
来自专栏xingoo, 一个梦想做发明家的程序员

http-server 超轻量级web服务器

有的时候做前端,想要运行一些代码,但是又没有必要使用tomcat或者Apache http server,这个时候一个轻量级的简单的http server就可...

29710

扫码关注云+社区