2012-05-20 15 views
5

ファイルのクローズや別のファイルのオープンが行われても、プログラムの実行中にファイルディスクリプタが再利用されないことを保証するには、Linux(というよりPOSIX OS)がありますか?私の理解では、このような状況は、通常、閉じられたファイルが新しく開かれたファイルに再割り当てされるファイル記述子につながります。ファイルディスクリプタの再利用の防止

私はopen()/ fopen()呼び出しの後で、そのファイル記述子への後続のすべての入出力が同じであると仮定することができれば、I/Oトレースプロジェクトに取り組んでいます。ファイル。

私はコンパイル時または実行時のいずれかの解決策をとる予定です。

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

+0

私はあなた自身の会計をやって2番目のアプローチを取るべきだと思います。ファイルディスクリプタの割り当て(POSIXで厳密に指定されている)の動作を不適合なものに変更すると、微妙な(そして危険な)方法でプログラムが中断されます。 –

答えて

7

POSIX requiresこと:

オープン()関数はその プロセスのために開いている現在、最も低いファイル記述子ではありませんという名前のファイル のためのファイルディスクリプタを返します。

厳密には、プログラムの環境がPOSIXに準拠しないように変更されます。

これは、への呼び出しを傍受して無視するために、LD_PRELOAD trickを使用することをお勧めします。

+0

おかげで、その良いです。 – mhowison

1

close(2)を含むSOを書き込んで、古いFDに/dev/nullを開き、アプリケーションを開始する前に$LD_PRELOADを使用してプロセス空間にロードする必要があります。

+0

実際には、トレースルーチンを実装するための__wrap_close()コールがすでにあるので、FD上で__real_close()を呼び出した後、そのルーチンの中にopen( "/ dev/null"これはいつも効果がありますか?私。私は__real_close()コールで閉じても、同じFDをopen( "/ dev/null")コールで返すことを保証していますか? – mhowison

+1

いいえ、なぜならあなたは一度開いて、 'dup2(2)'を使ってFDをコピーするのです。 –

+0

'__wrap_close'はトレースの目的には十分*近くありません。 'システムコール(SYS_open、...)'と考えてください。 –

1

ファイルの開閉操作を傍受するアプリケーションは、すでにptraceである必要があります。

dup2(X, Y); close(X);コールをアプリケーションに「注入」し、Yを任意の値に調整することで、FDの再使用を防止することは些細なことです。

しかし

自体は以前にFDを閉じての再使用を強制するdup2を使用することができ、アプリケーション、およびあなたがすることを防止した場合に動作しない場合がありますので、私はあなただけの後でこの問題に対処しなければならないと思います処理ステップ。

また、再利用を許可しないと、FDが不足するアプリを書くのは簡単です。