笔记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失败,不存在则新建一个文件。

 

 

 

 

 

 

 

posted on 2014-06-15 13:34  gradliang  阅读(1301)  评论(0编辑  收藏  举报

导航