UNIX/Linux open系統調用用與文件鎖

系統調用open大家都很熟了,其中包括創建和打開的各種組合,比如文件不存在就創建後再打開啥的,比較常用,還有個參數O_EXCL,比如下列两种情况:

open("xxx.tmp", O_RDWR | O_CREAT, 0666);
open(<span style="font-family: Arial, Helvetica, sans-serif;">"xxx.tmp"</span><span style="font-family: Arial, Helvetica, sans-serif;">, O_RDWR | O_CREAT | O_EXCL, 0666);</span>
帶O_EXCL與不帶,簡單來說差別是這樣的:
open("xxx.tmp", O_RDWR | O_CREAT, 0666);    //如果xxx.tmp存在,就打開,返回成功
open("xxx.tmp", O_RDWR | O_CREAT | O_EXCL, 0666);   //如果xxx.tmp存在,就返回失敗
這也就是O_EXCL所謂的“原子操作”。

有啥用呢?

比如倆程序都想獨佔一個文件,就用這個參數,必然後來的程序open出錯,讓它想其它的辦法去,避免了相互干擾。

那你說不用O_EXCL不行嗎?——還真可以,我想你說的是用如下方法實現:


if(access(file, R_OK) == -1 )   //检查文件是否存在
{
    open(file, O_RDWR | O_CREAT,0666);  //如果不存在,那我创建一个这样的文件
    ...  // 继续执行任务
}
固然可以,不過這裡有個問題:access和open是先後兩個系統調用,如果access的時候確實沒有,然後程序被掛起或者咋樣了,等它回來時這文件已經有了,然後在一open,還真能成功,可是已經衝突了,弄了別人的文件。

這篇帖子講得比較清楚:http://bbs.csdn.net/topics/350001997





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值