首页 > 其他 > 详细

笔记3-5: pread/pwrite函数

时间:2014-06-19 08:56:32      阅读:630      评论:0      收藏:0      [点我收藏+]

原子操作

一、添写到文件

    早期的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

笔记3-5: pread/pwrite函数

原文:http://www.cnblogs.com/gradliang/p/3789370.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!