2013-03-11 147 views
2

我有以下代碼片段運行在一個龐大的Linux守護進程中。 我試圖調試日誌文件,但是當日志文件存在,fopen失敗當文件存在時fopen失敗

if ((debugFILE = fopen("/home/lala/debug.log", "a")) == NULL) 
{ 
    perror("error: "); 
} 

我得到的錯誤是:「權限被拒絕」。

這是特定文件的LS的輸出:

----rw---- 1 lala lala 0 Mar 11 18:26 debug.log 

首先,文件爲什麼在這些權限firstplace創建。 二,爲什麼fopen在創建時成功,而不是在打開時成功?

+0

你的導演是什麼「umask -S」? – chrisaycock 2013-03-11 16:47:37

+0

@chrisaycock u = rwx,g = rwx,o = rx – stdcall 2013-03-11 16:48:50

回答

4

fopen創建許可0666文件由進程的umask修改。

因此,如果您沒有手動更改程序中的文件權限或程序完成後。

該過程很可能有一個錯誤的umask。

您是否在程序中或在調用過程的上下文中設置了umask?您的umask -S輸出實際上看起來很好(看起來像umask 002)。

4

「a」選項總是會創建一個文件,如果它不存在,並且成功返回一個有效的指針。它是根據進程的umask設置創建的 - 在您的情況下,該進程正在創建沒有適當權限的文件,因此下次fopen失敗。如果你不想與umask的一塌糊塗,只是前後fopen之後調用此:

chmod("/home/lala/debug.log", 0644); 

它的優良調用chmod這樣,如果該文件不存在,它會坐視不管(適當地設置errno除外)。