2012-03-06 30 views

答えて

2

最も使用されている機能の1つは、プロセス間のパイプストリームです.CLOEXECフラグが設定されている場合は実行できません(子プロセスはファイル記述子を継承できません。例:STDOUT_FILENO)。

また、execの後に継承されたファイル記述子を使用できないということはありません(例:標準ストリーム)。また、継承されたファイル記述子は、その値(整数)を知っている限り使用できます。この値は多くの場合、子プロセスに引数で渡されます(かなりのUNIXプログラムがそうしています)。または任意のIPC(プロセス間通信)メカニズムを使用してこれを行うことができます。

3

ファイル記述子は、execを呼び出して使用できます。これはUnixユーティリティがシェルから標準入力/出力/エラーfdsを取得する方法です。呼び出し元のプロセスイメージで開い

ファイル記述子は除いて、新しいプロセスイメージに開いたままにしなければならない。POSIX standard(とUnixの伝統は)反対の行動を義務付けているため

クローズ(close-on-exec)は、デフォルトではありませんclose-on-execフラグFD_CLOEXECが設定されている場合

+0

入力/出力/エラーfds以外の使用例はありますか? –

+0

フォークはexecではありません。 –

+0

おっと、脳のおなら。さて、現代のシェルには任意のfdリダイレクションがサポートされていますが、それには理由があります。私はそれを自分で見つけたことはありませんでした。 –

0

私はこれに完全な答えを得ても構いませんが、下位互換性のために推測するのはかなり簡単です。いつのまにかエグゼクティブ・クローズ・フラグを導入しなければならなかった。それ以前に存在していたコードはそのことを知らず、変更されない限り正常に動作しませんでした。したがって、デフォルトではオフになっています。

残念なことに、これによりバグが発生し、デーモンプロセスがcgiをforkするとlistenソケットが開いたままになる可能性があり、cgiが終了したり閉じなかったりすると、デーモンを再起動できません。だから私はそれが本当に良いデフォルトではないことに同意します。

関連する問題