多进程写文件的共享问题:

 
 
 
多进程写文件的共享问题:
 
 
多个进程对同一文件进行“定位-写-更新文件属性”时,i 节点的文件长度会变更,导致两个进程在写数据时,引发了数据覆盖等操作。
解决方法就是使用原子操作。

原子操作:
 
 
* open或者create时,使用O_APPEND 标志,写之前必须将偏移量移动至尾处,这样可以保证数据不会被覆盖。记录日志时会比较常用
* 使用原子读写:pread 和 pwrite
* 为防止“检测到文件不存在,则创建”被其他进程打断,创建文件时应使用 O_CREATE 和 O_EXCL 标志
* 复制已有描述符到新描述符使用 dup2(而非 fcntl)
pread 无法中断其定位和读,读完后不更新文件指针位置
pwrite 无法中断其定位和写,写完后不更新文件指针位置
复制现有描述符 dup 和 dup2:
两个函数都返回值最小的可用描述符,但 dup2 使用时较特殊:
int dup2(int filedes, int filedes2);
若 filedes2 未被打开,返回 filedes2
若 filedes2 已被打开,会先执行 close(fields2),之后再返回 filedes2
若 filedes = filedes2,不执行close,返回 filedes2
当要对磁盘上文件进行写操作时,流程:
1. 内容变更同步到缓冲区
2. 如果缓冲区未满,则等待新写入
3. 若缓冲区满,将缓冲区放入排队队列队首
4. 若缓冲区一直不在队首,则等待
5. 缓冲区到达队首,将变更内容刷至磁盘

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值