非同期サブプロセスが自身の標準出力に書き込んだ出力はフィルター関数(filter function)と呼ばれる関数に渡されます。デフォルトのフィルター関数は単に出力をバッファーに挿入します。このバッファーをプロセスに関連付けられたバッファーと呼びます(プロセスのバッファーを参照)。プロセスがバッファーをもたなければデフォルトフィルターは出力を破棄します。
サブプロセスが自身の標準エラーストリームに書き込む場合には、デフォルトではそのエラー出力もプロセスフィルター関数に渡されます。かわりに非nil
の:stderr
パラメーターでmake-process
(make-processを参照)を呼び出して、エラーの出力先を標準出力から分けることができます。
サブプロセス終了時にEmacsは保留中の出力を読み取って、その後そのサブプロセスからの出力の読み取りを停止します。したがってそのサブプロセスに生きた子プロセスがあり、まだ出力を生成するような場合には、Emacsはその出力を受け取らないでしょう。
サブプロセスからの出力はEmacsが待機している間、端末入力読み取り時(関数waiting-for-user-input-p
、時間の経過や入力の待機のsit-for
とsleep-for
、プロセスの出力を受け取るのaccept-process-output
、およびプロセスへのデータ送信関数(プロセスへの入力の送信を参照)のみ到着可能です。これは並列プログラミングで普遍的に悩みの種であるタイミングエラーの問題を最小化します。たとえば安全にプロセスを作成して、その後でのみプロセスのバッファーやフィルター関数を指定できます。その間にあるコードが待機するプリミティブを何も呼び出さなければ、完了するまで到着可能な出力はありません。
いくつかのシステムではEmacsがサブプロセスの出力を読み取る際に出力データを非常に小さいブロックで読み取るために、結果として潜在的に非常に貧弱なパフォーマンスとなることがる。この挙動は変数process-adaptive-read-buffering
を非nil
値(デフォルト)にセットして拡張することにより改善し得る。これにより、そのようなプロセスからの読み取りを自動的に遅延して、Emacsが読み取りを試みる前に出力がより多く生成されるようになる。