2012-10-27 18 views
5

私のCプログラムで動作を実装したいので、SIGINTが発生した場合、開いているファイル記述子をすべて閉じるようにします。それらのリストを取得する簡単な方法はありますか?C開いているファイル記述子をすべて取得する

+2

シグナルハンドラを検索してください。 –

+1

なぜそんなことが欲しいですか? – qdot

+1

メインからexit();または 'return'した後、カーネルはそれらのファイル記述子を閉じなければなりません。 – yeyo

答えて

5

ブルートフォース:for (i = 0; i < fd_max; ++i) close (i);を使用します。すばやくかわいい。 POSIXシステム用

+0

明らかにはるかに簡単、はい! - )しかし、レースは依然として問題かもしれません。 – alk

+3

最大 'fd_max'を見つけるのに' getrlimit(RLMIIT_NOFILE、&rlim) 'を使いたいかもしれません。 –

+0

'stdin'のファイル記述子を閉じてもよろしいですか? 'stdout'と' stderr'(0,1,2)? – alk

3

開いているすべてのファイル記述子を追跡し、個別に閉じます。

通常は、使用しているライブラリにファイルが開いている可能性があり、そのライブラリを閉じるとそのライブラリが誤動作する可能性があります。

実際には、ファイルディスクリプタを無差別に閉じると、プログラムの別の部分がファイルディスクリプタを覚えて使用しようとすると、予期しないエラーが発生する可能性があります。他のファイルはが間違ったファイルで動作して以来開かれています。ファイルを開く責任を持つコンポーネントがファイルを閉じる責任を持つことは、はるかに優れています。

2

利用可能であれば、/proc/<pid>/fd.の内容を読むことができます。

しかし、あなたのアプリケーションがいくつかを閉じたり、新しいものをあなたの読んだ/proc/<pid>/fdの間に開き、あなたが読んだものを閉じようとしている場合に発生する可能性がある、潜在的な競合に注意してください。

私はこれにケビン・リードのアプローチを推奨したいと思います。

+0

なぜ、 '/ proc'が利用できると思いますか?それは存在で最もunportableな悪夢についてです。 – Jens

+0

あなたは正しいです。私は自分のコメントを修正して、特定のシステムにしか適さないようにしました。 @Jens – alk

+0

移植性に懸念があれば、 '/ dev/fd /'を読むことができます。これは '/ proc/self/fd'より移植性が高いです。 –

1

私のソリューション:

すべてがFD年代が可能な最低値である開かれました。
open(2)にラッパー関数を作成します。
あなたの新しい関数は、要求されたfdを開き(そして返す)、その値をdefine_if_is_the_higtest_fd_and_store_it()という関数に渡します。
save_fd()(初期値は3(cuz stderrは2))という名前のシングルトン関数(1 'ディスクリプタテーブルのみがあります)の場合にのみアクセス可能です。int hightest_fd_savedが必要です。
シグナル機能にSIGINTを設定してください。内部では、[3、return_fd()]からループを実行します。

私はそうだと思います...

関連する問題