原子操作
一、添写到文件
早期的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