3

大規模な Linux デーモン内で次のコード スニペットを実行しています。ログ ファイルにデバッグしようとしていますが、ログ ファイルが存在するとfopen失敗します。

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

私が得るエラーは次のとおりです。「許可が拒否されました」。

これは、特定のファイルの ls の出力です。

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

まず、これらの権限でファイルが最初に作成された理由。第 2 に、作成時には fopen が成功するのに、開くときは成功しないのはなぜですか?

4

2 に答える 2

4

fopen0666プロセスの によって変更されたパーミッションでファイルを作成しますumask

そのため、プログラム内またはプログラムの終了後にファイルのアクセス許可を手動で変更しない場合。

プロセスの umask が間違っている可能性があります。

umaskプログラム内または呼び出しプロセスのコンテキスト内で設定しますか? あなたのumask -S出力は実際にはうまく見えます( umask のように見えます002)。

于 2013-03-11T20:33:17.543 に答える
4

「a」オプションは、ファイルが存在しない場合は常にファイルを作成し、成功した場合は有効なポインターを返します。プロセスの umask 設定に従って作成されます。あなたの場合、プロセスは適切な権限なしでファイルを作成しているため、次回はfopen失敗します。umask をいじりたくない場合は、これを の前後に呼び出してfopenください:

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

ファイルが存在しない場合は、この方法で呼び出しchmodても問題ありません。(errno適切に設定することを除いて) 何もしません。

于 2013-03-11T16:56:38.403 に答える