2016-03-25 1 views
0

私は、シェルと同様の動作をするが、フォアグラウンドのプロセスとパイプだけをサポートするプログラムを作ることに取り組んでいます。私は同じパイプに複数のプロセスを書き、パイプの通常の使用法とは異なるいくつかのプロパティを持っています。とにかく、私の質問は、プロセスのすべてのパイプを閉じる

3つの基本的なものを除いて、プロセスのすべてのファイル記述子を閉じる簡単な方法(自動)はありますか?

私はすべてのプロセスのすべてのファイル記述子を追跡するのが非常に難しいので、この質問をしています。そして時々彼らは私にいくつかの予測不可能な方法で行動します。それは、私がそれらを非常に完全に理解していないという事実のせいかもしれません。

+0

シェルスクリプトまたはC? – marc

+0

申し訳ありませんが、私は言及を忘れていました。それはC++です。 – Pure

+0

あなたのコードの抽出を追加してください... – marc

答えて

2

3つの基本的なものを除いて、プロセスのすべてのファイル記述子を閉じる簡単な方法(自動)はありますか?これを行うには

通常の方法は、単にそれらのすべてを反復処理し、それらを閉じることです。

for (i = getdtablesize(); i > 3;) close(--i); 

すでにワンライナーだこと。これ以上は「自動」にはなりません。

私はすべてのプロセスのすべてのファイル記述子を追跡するのが非常に難しいので、この質問をしています。

それは、それが使用されますどのように、(例えばdup2()fork())を重複して取得したときに、あなたが開いた各ファイルディスクリプタのライフサイクルを考えるためにあなたの時間の価値がある、とあなたがどのように各1を占めるようになりますもはや必要がなくなったら閉鎖されるだろう。リークされたファイル記述子の問題を無差別に閉じてしまうことは、持続可能ではないでしょう。

私はあなたがこれを行う場合は

は、その後、あなたはデータがパイプのもう一方の端に到着した順序があることを行っていることを認識する必要があり、同じパイプに書き込む複数のプロセスを持っています予測不可能な。データストリームの破損を避けることは困難です。

+0

あなたの答えをありがとう。私は、別の方法ですべての不要なファイルディスクリプタを閉じることで私の問題を解決しましたが、私は後でそれが必要な場合に備えてこのメモを残しておきます。 – Pure

1

closefrom(3) Cライブラリ関数を使用してください。マンページから

closefrom()システムコールは、開いているすべてのファイルを削除するには、プロセスごとのオブジェクト参照テーブルからをlowfdより 大きいか等しい記述子。 ファイル記述子を閉じるときにエラーが発生した場合、無視されます。

使用例:

#include <unistd.h> 

int main() { 
    // Close everything except stdin, stdout and stderr 
    closefrom(3); // Were 3 is the lowest file descriptor you wish to close 

    printf("Clear of all, but the three basic file descriptors!\n"); 
    return 0; 
} 

これは、ほとんどのUnixで動作しますが、は、Linuxためlibbsdサポートライブラリが必要です。

+0

URLを提供できますか? Linuxのどのサブクラスですか?私はhttp://linux.die.net/で見つけることができません。これは私が通常Linuxのマニュアルページを探す場所です。 –

+0

@Lonathan Leffler Linuxの場合、実際には 'libbsd'(* BSDシステムのユーティリティ関数)でしか利用できません。Unixy *がこれをネイティブシステムやライブラリ呼び出しとして持っていれば – alexander255

+0

Hmmm; Mac OS Xが_Unixy_であるかどうか疑問に思う10.11.4 El Capitanはそれを持っていないようだ(すべてBSDベースのライブラリである)OTOHのSolaris 10にはヘッダ()があるが、HP-UX 11.23そうではなく、AIX 6.3もそうではありません。HPとIBMのリリースは最新ではありません。 –

関連する問題