笔记3-5: pread/pwrite函数

本文介绍了原子操作在文件追加写入中的应用,包括如何通过O_APPEND选项实现文件定位与写入的原子性,以及如何使用pread和pwrite函数进行原子定位搜索与执行读写I/O操作。此外,还讨论了如何原子性地创建文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原子操作

一、添写到文件

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

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/gradliang/p/3789370.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值