Cプログラムに動作を実装して、SIGINTが発生した場合に、開いているすべてのファイル記述子を閉じるようにします。それらのリストを取得する簡単な方法はありますか?
4 に答える
開いているすべてのファイル記述子を追跡し、それらを個別に閉じます。
一般的なケースでは、使用しているライブラリでファイルが開いている可能性があり、それを閉じるとそのライブラリが誤動作します。
実際、同じ問題が自分のコードに存在する可能性があります。ファイル記述子を無差別に閉じても、プログラムの別の部分がファイル記述子を記憶して使用しようとすると、予期しないエラーが発生するか、(他のファイルが以来開かれました)間違ったファイルを操作します。ファイルを開く責任があるコンポーネントが、ファイルを閉じる責任もある方がはるかに優れています。
可能な場合は、の内容を読み取ることができ/proc/<pid>/fd.
ます。
ただし、読み取りの間にアプリケーションが一部を閉じたり、新しいアプリケーションを開いたりして、読み取ったものを閉じようとしている場合に発生する可能性のある競合に注意してください/proc/<pid>/fd
。
結論として、これに対するケビン・リードのアプローチをお勧めしたいと思います。
私はブルートフォースを使用します: for (i = 0; i < fd_max; ++i) close (i);
. 速くてかなりポータブル。
POSIX システムの私のソリューション:
開いているすべての fd は可能な限り低い値です。
のラッパー関数を作成しますopen(2)
。
新しい関数は、要求された fd を開き (そして返し)、その値を という関数に渡しますdefine_if_is_the_higtest_fd_and_store_it()
。(初期値は 3 (cuzは 2))という名前のシングルトン関数 (「記述子テーブル」は 1 つしかない) に対してのみアクセスできるよう
にする必要があります。シグナル機能に合わせて
構成します。内部では、[3, ] からループします。int hightest_fd_saved
save_fd()
stderr
SIGINT
return_fd()
それだけだと思います...