笔记3-5: pread/pwrite函数

原子操作

一、添写到文件

早期的UNIX的open函数里面,不支持O_APPEND的选项。所以要追写到文件结尾处,必须先利用lseek把文件偏移量移到文件的结尾处,再进行write操作。

如果当前进程A刚执行完lseek后,系统进程调度作用切换到了另一个进程B,进程B对同一个文件进行了写操作。进程B写文件后,系统再把控制权交还进程A,这时进程A所指向的文件偏移量已经不再是最结尾处,如果写入数据,就会覆盖到进程B刚才写入的数据。

UNIX提供一个方法使追加写入成为一个原子操作,该方法是在open一个文件时,使用O_APPEND选项。使用O_APPEND选项打开文件,每次调用write之前,会先保证当前进程的文件偏移量移到文件结尾处。移动文件偏移量与write合并为一个原子操作。

二、原子定位搜索与执行读写I/O

函数原型:

#include <unistd.h>

ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);

ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset);

pread返回读到的字节数,若到达文件结尾返回0,出错返回-1。

pwrite返回已写的字节数,出错则返回-1。

pread/pwrite相当与先执行lseek再执行read/write,但是两者合并为原子操作,无法中断定位与读写操作。

注意:pread/pwrite不更新文件指针(偏移量)。

三、原子性地创建一个文件

open函数的O_CREAT与O_EXCL选项合并使用时,可以原子地创建一个文件,该操作先检查文件是否存在,如果存在则open失败,不存在则新建一个文件。

笔记3-5: pread/pwrite函数,布布扣,bubuko.com

时间: 2024-12-28 18:43:00

笔记3-5: pread/pwrite函数的相关文章

文件IO详解(十三)---pread函数和pwrite函数详解

pread和pwrite函数是Linux提供的另外一种读取和写入文件的操作.pread函数的操作可以看作是顺序调用了lseek函数和read函数,同样pwrite函数也类似. ====================================================== 函数原型: 函数参数: fd:要操作的文件描述符 buf:在pread函数中表示存储读出数据的内存首地址,在pwrite函数中表示写入数据的内存首地址 count:在pread函数中表示希望读出的字节数,在pwri

Linux系统函数read()/write()/pread()/pwrite()的区别-(转自CSDN网络)

在Linux和UNIX中有很多的输入输出函数,有时真是让想跟它攀点关系的菜鸟们束手无策.先来看看都有哪些函数,通过解析与总结,看看能不能让大家能这些函数有个理性的认识,哦,原来是这么回事,也就算我没白花这份闲. 内核文件I/O->标准库I/O->高级I/O->IPC中 1.         read()/write(); 2.         pread()/pwrite(); 3.         getc()/putc(); 4.         fgetc()/fputc(); 5

C++笔记(3):函数的参数和返回值

刚学C++那会,做课程设计的时候总是会去网上很找别人写好的程序来参考,那时候看到函数参数列表里各种复杂的类型和奇怪的写法就头大,后来总算是慢慢搞清楚了,在此对函数各种类型的形参以及函数的返回值进行一下总结. 1.普通形参 传递普通形参也就是值传递,传递的是实际参数的一个副本,当函数被调用时,形参复制实参,也就是说此时形参和实参的值是一样的,但形参在内存中拥有自己的地址.当函数结束时形参的生命周期终止,函数内部的操作不会影响到实参的值.经典的值交换函数代码如下: void swap1(int a,

sk_buff整理笔记(二、操作函数)

承接上一篇:sk_buff整理笔记(一.数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数. 第一.首先要讲的是sk_buff中的四大指针: 四大指针分别是:head.data.tail.end:这四个指针都是指向了数据区的,数据区中存放的是协议头和数据.head和end指针是每个数据包一样的,也是有这两个指针来确定数据区的大小的.最开始的时候head.data.tail三个指针都是指向一起的,当有协议数据加进来时才更改. 再来说下包的形成,首先是应用层的数据,然后到四层加上四层

《python源码剖析》笔记 python虚拟机中的函数机制

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.Python虚拟机在执行函数调用时会动态地创建新的 PyFrameObject对象, 这些PyFrameObject对象之间会形成PyFrameObject对象链,模拟x86平台上运行时栈 2.PyFuctionObject对象 typedef struct { PyObject_HEAD PyObject *func_code: //对应函数编译后的PyCodeObject对象 Py

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

Silverlight动画学习笔记(三):缓动函数

(一)定义: 缓动函数:可以将自定义算术公式应用于动画 (二)为什么要用缓动函数: 您可能希望某一对象逼真地弹回或其行为像弹簧一样.您可以使用关键帧动画甚至 From/To/By 动画来大致模拟这些效果,但可能需要执行大量的工作,并且与使用算术公式相比动画的精确性将降低. (三)实例讲解: 1 <UserControl x:Class="AnimationStudy.EasingFunctionAnimation" 2 xmlns="http://schemas.mic

《学习opencv》笔记——关于一些绘图的函数

绘图函数 (1)直线cvLine函数 其结构 void cvLine(//画直线 CvArr* array,//画布图像 CvPoint pt1,//起始点 CvPoint pt2,//终点 CvScalar color,//颜色 int thickness = 1,//宽度 int connectivity = 8//反走样 ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> int main

C++学习笔记8,const在函数方面的使用(二)

7.1和7.1.1由于越狱不成熟,半完美越狱后电脑上无法访问系统越狱目录,如var usr 等等. 今天有些意外地发现,可以在电脑上使用手机的越狱目录我手机 i4 7.1.1 联通 半完美越狱,没装Afc2Add,也没装Appsync 附上  --->我的半完美越狱过程 好了,下面直接正题 一.前提,必须安装ifile! 打开ifile,并转到 /var/mobile/media 目录下,然后点击右上角的 [ 编辑 ]如图: 二.点左下角的 + 号创建,如图: 三.点 [ 类型],选择[符号链接