2015-11-21 26 views
0

我試圖獲得一個函數,它將創建一個用於程序的目錄,但當該目錄已經存在時會很好地失敗。現在我在做當目錄存在時處理mkdir(C語言)

if (mkdir(path, RW)<0) 
{ 
error out and return 
} 

我的問題是,MKDIR返回-1爲我所想的目錄爲「真正的錯誤」(無接觸,無空間,等..),以及已經存在的。除了目錄之外,我確實希望在每個錯誤情況下都出錯。有什麼建議?

參考: http://linux.die.net/man/3/mkdir

+0

你應該看到'man errno'(http://man7.org/linux/man-pages/man3/errno.3.html)。在http://linux.die.net/man/3/mkdir,你可以看到返回值。如果有一個錯誤將會是-1,並且會設置'errno'。 – ViniciusArruda

+2

您應該統計路徑並查看是否返回成功。有一點需要注意的是路徑已經存在,但它是一個文件而不是目錄。 Stat也會告訴你。 – bruceg

回答

1

你應該做的第一mkdir,因爲這樣做第一stat會更容易受到競爭條件。在這裏你有

error out and return 

你應該先檢查是否errnoEEXIST行(這會發生,如果已經有一個文件或目錄),並且在特殊情況下,做一個stat,以確定是否有實際一個目錄(與文件或特殊設備等)。

競態條件是指多個進程創建,刪除和使用目錄(或文件)的場景。例如:

1

基本上這是我做的:

errno = 0; 
int dir_result = mkdir(dir_path, 0755); 
if(dir_result != 0 && errno != EEXIST){ 
    //errors here 
} 
else{ 
    //your code here 
} 

問候。