2010-04-03 69 views
6

考慮下面的代碼(它應該在的「HelloWorld」文件寫的「HelloWorld」,然後閱讀文本):空調系統調用open /讀/寫/關閉和O_CREAT | O_EXCL

#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

#define FNAME "helloworld" 

int main(){ 
    int filedes, nbytes; 
    char buf[128]; 

    /* Creates a file */ 
    if((filedes=open(FNAME, O_CREAT | O_EXCL | O_WRONLY | O_APPEND, 
     S_IRUSR | S_IWUSR)) == -1){ 
      write(2, "Error1\n", 7); 
    } 

    /* Writes hello world to file */ 
    if(write(filedes, FNAME, 10) != 10) 
     write(2, "Error2\n", 7); 

    /* Close file */ 
    close(filedes); 

    if((filedes = open(FNAME, O_RDONLY))==-1) 
     write(2, "Error3\n", 7); 

    /* Prints file contents on screen */  
    if((nbytes=read(filedes, buf, 128)) == -1) 
     write(2, "Error4\n", 7); 

    if(write(1, buf, nbytes) != nbytes) 
     write(2, "Error5\n", 7); 

    /* Close file after read */ 
    close(filedes); 

    return (0); 
} 

我第一次運行該程序時,輸出爲:

helloworld 

之後,我每次運行程序時,輸出爲:

Error1 
Error2 
helloworld 

我不明白爲什麼文本沒有添加,因爲我已經指定了O_APPEND文件。 是因爲我包含了O_CREAT嗎? 它的文件已經創建好了,是不是應該忽略O_CREAT?

回答

11

O_EXCL強制文件被創建。如果文件已經存在,則呼叫失敗。

它用於確保必須創建文件,並在第三個參數中傳遞給定的權限。總之,您有以下選項:

  • O_CREAT:如果文件尚不存在,請使用給定權限創建文件。如果文件存在,它將被打開並且權限被忽略。
  • O_CREAT | O_EXCL:如果文件尚不存在,請使用給定的權限創建文件。如果該文件存在,則失敗。這對創建鎖文件和保證對文件的獨佔訪問很有用(只要使用該文件的所有程序遵循相同的協議)。
  • O_CREAT | O_TRUNC:如果文件尚不存在,請使用給定的權限創建該文件。否則,截斷文件爲零字節。當我們認爲「創建一個新的空白文件」時,這會產生更多的效果。不過,它仍然保留已存在於現有文件中的權限。從the manual page

的更多信息:

O_EXCL

當O_CREAT使用時,如果該文件 已經存在,這是一個錯誤, 的open()將失敗。在這種情況下, 存在一個符號鏈接,無論它指向何處 。 NFS文件系統上的O_EXCL被破壞 ; 依靠它來執行鎖定的程序 任務將包含競爭條件。 用於使用鎖文件來創建 同一文件 系統上的唯一的文件(例如,包含主機名 和PID),使用鏈路(2),以使一個鏈接 到鎖文件執行原子 文件鎖定該溶液。如果link()返回0, ,則鎖定成功。否則,在唯一文件上使用 stat(2)來檢查其鏈接計數是否增加到2,在 這種情況下鎖定也是 成功。

+0

謝謝,通過刪除O_EXCL代碼是功能。你能解釋我使用O_EXCL嗎? – 2010-04-03 20:03:41