淘先锋技术网

首页 1 2 3 4 5 6 7

系統調用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