Windows の PID 割り当てポリシー / 一時ファイルの命名に PID を使用する
-
13-09-2019 - |
質問
Windows の PID 割り当てポリシーとは何ですか?_getpid() を呼び出すプロセスが繰り返し実行されると、非順次割り当て (3548,3344,3628,2748,4872,2360) が示されます。
PID の非連続割り当てが観測されたことを考慮すると、同じ PID を持つ 2 つの異なるプロセスが、互いに近い時間で実行される可能性はあるでしょうか?明らかに、プロセスは同時に実行されません。
一時ファイルの名前付けに PID を使用するのは特に賢明ではありませんか?
必要な入力ファイルを生成し、実行可能ファイルを呼び出し、生成された出力ファイルをその実行可能ファイルから読み取ることによって、別の実行可能ファイルと対話するプログラムを作成しています。CLEAN が終了すると、中間ファイルは削除されます。
私の懸念は、一時ファイルがクリーンアップされず、PID が再利用された場合、クリーンアップされていない古い一時ファイルと新しいファイルの間にあいまいさが生じる可能性があることです。エラーにより実行可能ファイルが新しい出力ファイルを生成しない場合、古いファイルが新しく作成されたファイルのように見える可能性があるため、エラーが捕捉されない可能性があります。
一時ファイルに GUID を使用する、一時ファイルにクリーンなディレクトリのみを使用する、ターゲット出力ファイルと同じ名前のファイルがないことを確認するなど、堅牢性を追加する他の方法もあります。マシンの再起動時、またはマシンが十分な時間実行されたままになっている場合、PID は確実に繰り返されるため、これらの手法のいくつかを使用する必要があります。
この質問は主に、なぜ Windows が *nix とは異なる方法で PID を割り当てるのかという私の好奇心から生じています。
解決
このようにPIDを使用することは問題があります。私は、ファイルに名前を付けるときにfoo_55145_4a3667d3.log
という名前のファイルで終わるように、現在のUTC時刻と連動してPIDを使用するプログラムを見てきました。他のオプションは、 FILE_ATTRIBUTE_TEMPORARY
FILE_FLAG_DELETE_ON_CLOSEパラメータでdwFlagsAndAttributes
とCreateFile()
オプションを使用します>。
他のヒント
プロセスIDとスレッドIDは、Windows上の同じプールから来ます。システムはすぐにスレッドやプロセスIDを再利用します。