Linux应用开发--原子操作

对于操作一个文件,我们想在文件末尾追加一些内容,如果是单个进程的话那么能没有任何问题的完成任务,但如果多个进程都想给文件追加内容的话那就容易出问题了,出现什么问题呢?就是最后的操作结果根本就不是你能接受的了的。

假定两个进程A和B都对同一个文件进行追加内容操作。两个进程都已经打开了该文件,但未使用O_APPEND标志。因此每个进程都有它自己的文件表项,他们有各自的文件状态标志和当前文件偏移,但是他们共享v节点指针。假如进程A调用了定位文件指针函数lseek,它在文件尾端设置偏移500个字节。然后内核切换了进程运行,进程B将文件尾端偏移也设置为500,然后B调用write函数使文件偏移增加至600,由于共享v节点指针,将文件长度更新为增加600字节,然后又切换回A运行,A调用write写入内容时会从文件尾端偏移500处开始写入,这样就会将B写入的数据覆盖一部分。

问题出在将文件定位和写操作分成两部分的裸机操作。解决方法是这两个操作对于其他进程是原子操作。(任何要求多于一个函数调用的操作都不会是原子操作,因为在两个函数调用之间可能会出现内核调度的情况导致自身进程挂起)。Unix给我们提供了一种方法,即在打开文件时使用O_APPEND标志,进程对文件偏移量调整和数据追加成为原子操作,这样就不用每次在写操作之前使用lseek定位到文件尾端了。

还有另一种原子操作:对open函数的O_CREAT和O_EXCL的使用,如果该文件存在,open将失败,否则创建该文件,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值