2011-12-24 12 views
1

私はたくさんのソケット(約700ソケット)を作成しているソケットを持つPERLスクリプトを持っています。その後、system(...)コマンドを使用して別のアプリケーションを起動します(800など)が開きますが、プロセスあたりのソケット数の制限は1024なので、制限を超えて、予想されるデータを1024以上のソケット番号。子プロセスの不要なオープンソケット

は今、私の質問はこれです:

  1. システムコマンドを継承するには、すべてのオープン・ファイル記述子/ソケット起動したアプリケーションを作成していますか?
  2. 上記の質問に対する答えが「はい」の場合、起動したアプリケーションがファイル記述子を継承しないように別のアプリケーションを起動する方法がありますか?
  3. 2.答えが「いいえ」の場合、子プロセスのすべての継承されたファイル記述子を閉じる方法はありますか?
+0

これはUNIXライクなシステムであると仮定して、ユーザごとのfd制限はいくらですか? – pilcrow

+0

ユーザーあたりの制限はありますか?私はそれを知らなかった... プロセスごとの制限は1024に設定されているので(0〜1023は正常に動作し、1024は失敗する)... – mtahmed

+0

私は、ユーザーのプロセスのリソース制限が、システム。 system()の直前に '$^F'を印刷できますか?あなたは 'system( 'ulimit -n; exec your_command ...')'現在の制限を見ることができますか? – pilcrow

答えて

3

perlvar $^Fを見て、close-on-execに設定されているファイルディスクリプタを制御します。 system()を呼び出すと、デフォルトの設定でこれらのソケット記述子がすべて閉じられているはずですが、そうでない場合は$^Fが必要なものに設定されていない可能性があります。 Linuxシステム上で伝えるには非常に迅速かつ簡単な方法は、右の既存のシステム()の呼び出しの前に、この呼び出しをしようとするだろう:

system("ls -l /proc/self/fd"); 

のlsの出力は、ファイルが開いたままにして何が表示されますとき " ls "コマンドが実行されました。ほとんどの場合、stdin、stdout、stderr(ディスクリプタ0,1、および2)のみがオープンしていますが、ソケット記述子が開いているとわかりますが、$^F = 2を設定してみてください。

+0

さて、私は28日にこれを試してみる...ありがとう – mtahmed

+0

好奇心のちょっとした質問... Cの子プロセスでオープンソケットを閉じる方法を知っていますか? – mtahmed

+0

確かに、クローズオンエグゼクティブがうまくいかない理由がわかっていないとすれば(stdin、stdout、stderrをすべて強制的に強制することができます)、 'for(my $ fd = 3; $ fd <1024; $ fd ++){ open(F、 "<&= $ fd"); } 「 – andy

関連する問題