Next: , Previous: , Up: プロセス   [Contents][Index]


39.9 プロセスからの出力の受信

非同期サブプロセスが自身の標準出力に書き込んだ出力はフィルター関数(filter function)と呼ばれる関数に渡されます。デフォルトのフィルター関数は単に出力をバッファーに挿入します。このバッファーをプロセスに関連付けられたバッファーと呼びます(プロセスのバッファーを参照)。プロセスがバッファーをもたなければデフォルトフィルターは出力を破棄します。

サブプロセスが自身の標準エラーストリームに書き込むと、デフォルトではそのエラー出力もプロセスフィルター関数に渡されます。Emacsがサブプロセスとの対話にpty(pseudo-TTY: 疑似端末)使っていると、ptyにの出力チャンネルは1つだけなので、標準出力と標準エラーのストリームを分けることは不可能です。このような場合にこれらのストリームを個別に保ちたい場合には、start-process-shell-commandや同様の関数を通じて適切なシェルコマンドを用いることによって、いずれかのストリームをファイルにリダイレクトする必要があります。

かわりに非nil:stderrパラメーターでmake-process (make-processを参照)を呼び出して、エラーの出力先を標準出力から分けることができます。この場合には、サブプロセスとの対話にEmacsはpipeを用いることになります。

サブプロセス終了時にEmacsは保留中の出力を読み取って、その後そのサブプロセスからの出力の読み取りを停止します。したがってそのサブプロセスに生きた子プロセスがあり、まだ出力を生成するような場合には、Emacsはその出力を受け取らないでしょう。

サブプロセスからの出力はEmacsが待機している間、端末入力読み取り時(関数waiting-for-user-input-p時間の経過や入力の待機sit-forsleep-forプロセスの出力を受け取るaccept-process-output、およびプロセスへのデータ送信関数(プロセスへの入力の送信を参照)のみ到着可能です。これは並列プログラミングで普遍的に悩みの種であるタイミングエラーの問題を最小化します。たとえば安全にプロセスを作成して、その後でのみプロセスのバッファーやフィルター関数を指定できます。その間にあるコードが待機するプリミティブを何も呼び出さなければ、完了するまで到着可能な出力はありません。

Variable: process-adaptive-read-buffering

いくつかのシステムではEmacsがサブプロセスの出力を読み取る際に出力データを非常に小さいブロックで読み取るために、結果として潜在的に非常に貧弱なパフォーマンスとなることがる。この挙動は変数process-adaptive-read-bufferingを非nil値(デフォルト)にセットして拡張することにより改善し得る。これにより、そのようなプロセスからの読み取りを自動的に遅延して、Emacsが読み取りを試みる前に出力がより多く生成されるようになる。