2

PHPでは、fopenxを実行するときにフラグを使用できます。

作成して書き込み専用に開きます。ファイルポインタをファイルの先頭に置きます。

ファイルがすでに存在する場合、fopen()呼び出しは、FALSEを返し、レベルE_WARNINGのエラーを生成することによって失敗します。

ファイルが存在しない場合は、作成してみてください。これは、基礎となるopen(2)システムコールにO_EXCL|O_CREATフラグを指定することと同じです。

これは、(異なるユーザーからの)同時fopen要求がいくつあっても、ファイルが1回だけ作成され、上書きされないことが保証されていることを意味しますか?

if ($handle = fopen("part006", "x+b")) {
    do_some_processing();
    echo "You managed to process.";
    /*

    can we guarantee that only 1 user (http request)
    will ever process the function and see the
    message "you managed to process" ?

    */
} else {
    echo "You failed to process.";
}
4

1 に答える 1

1

回答:他のプロセスもO_EXCLを使用している限り、ファイルは1回だけ作成され、上書きされないことが保証されています。そうでない場合は、ファイルを上書きできます。したがって、O_EXCLを使用してファイルを開く(作成する)ことは、ファイルがある程度書き込み保護されていることを意味しません。

説明:fopenは基礎となるopensyscallを使用します。マニュアルページから:man 2 open

O_EXCL

O_CREATとO_EXCLが設定されている場合、ファイルが存在する場合、open()は失敗します。ファイルの存在のチェックとファイルが存在しない場合のファイルの作成は、O_EXCLとO_CREATが設定された同じディレクトリ内の同じファイル名に名前を付けるopen()を実行する他のスレッドに対してアトミックである必要があります。O_EXCLとO_CREATが設定されていて、パス名がシンボリックリンクの場合、open()は失敗し、シンボリックリンクの内容に関係なくerrnoを[EEXIST]に設定します。O_EXCLが設定されていて、O_CREATが設定されていない場合、結果は未定義です。

于 2013-03-09T03:58:20.913 に答える