7

Linux(またはより一般的にはPOSIX OS)には、プログラムの実行中に、ファイルが閉じられて別のファイルが開かれた場合でも、ファイル記述子が再利用されないことを保証するものはありますか?私の理解では、この状況では通常、閉じたファイルのファイル記述子が新しく開いたファイルに再割り当てされます。

私はI/Oトレースプロジェクトに取り組んでおり、open()/ fopen()呼び出しの後、そのファイル記述子に対する後続のすべてのI / Oが同じファイルに対するものであると想定できれば、作業が簡単になります。

コンパイル時または実行時のソリューションを採用します。

それが不可能な場合は、トレースファイルを処理するときに自分でアカウンティングを行うことができます(すべてのオープンコールとクローズコールの場所を記録します)が、トレースされたプログラムの実行中に問題を解決したいと思います。

4

3 に答える 3

9

POSIXには以下が必要であることに注意してください。

open()関数は、指定されたファイルのファイル記述子を返します。これは、そのプロセスで現在開かれていない最も低いファイル記述子です。

したがって、厳密な意味では、要求によってプログラムの環境が変更され、POSIXに準拠しなくなります。

そうは言っても、あなたの最善の策は、LD_PRELOADトリックを使用して、呼び出しを傍受しclose、それらを無視することだと思います。

于 2012-05-20T00:41:22.080 に答える
1

古いFDでclose(2)開くを含むSOを作成し、それを使用してアプリケーションを起動する前にプロセススペースにロードする必要があります。/dev/null$LD_PRELOAD

于 2012-05-20T00:29:41.920 に答える
1

ptraceファイルのオープンおよびクローズ操作をインターセプトするには、アプリケーションをすでに実行している必要があります。

dup2(X, Y); close(X);アプリケーションに呼び出しを「注入」し、必要に応じて調整することで、 FDの再利用を防ぐのは簡単なことのように思われYます。

ただし、アプリケーション自体が以前に閉じたFDの再利用dup2を強制するために使用している可能性があり、それを防ぐと機能しない可能性があるため、後処理ステップでこれに対処する必要があると思います。

また、再利用を許可しない場合にFDが不足するアプリを作成するのは非常に簡単です。

于 2012-05-20T00:34:14.450 に答える