GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Output-from-Processes.html ・ emacs-doc.conao3.com

41.9 プロセスからの出力の受け取り

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

サブプロセスが標準エラーストリームに書き込む場合、デフォルトではエラー出力もプロセスフィルタ関数に渡されます。あるいは、make-process の呼び出し時に :stderr パラメータに nil 以外の値を指定することで(make-process を参照)、エラー出力の送信先を標準出力とは別に設定することも可能です。

サブプロセスが終了すると、Emacsは保留中の出力を読み取り、その後、そのサブプロセスからの出力の読み取りを停止します。したがって、サブプロセスにまだ稼働しており、出力を出し続けている子プロセスがある場合、Emacsはその出力を受け取ることができません。

サブプロセスからの出力は、Emacsが待機している間にのみ届きます。具体的には、ターミナル入力の読み取り時(関数 waiting-for-user-input-p を参照)、sit-for および sleep-for(経過時間または入力の待機 を参照)、accept-process-output(プロセスからの出力の受理 を参照)、およびプロセスにデータを送信する関数(プロセスへの入力の送信 を参照)においてです。これにより、並列プログラミングで頻発するタイミングエラーの問題を最小限に抑えることができます。例えば、プロセスを安全に作成し、その後でバッファ関数やフィルタ関数を指定することが可能です。その間のコードで待機を行うプリミティブを一切呼び出さない限り、処理が完了する前に出力が届くことはありません。

変数: process-adaptive-read-buffering

一部のシステムでは、Emacsがサブプロセスからの出力を読み込む際、出力データが非常に小さなブロック単位で読み込まれるため、パフォーマンスが著しく低下することがあります。この挙動は、変数 process-adaptive-read-buffering に nil 以外の値を設定することである程度改善できます。これにより、こうしたプロセスからの読み込みが自動的に遅延され、Emacsが読み込みを試みる前に、より多くの出力が生成されるようになります。nil 以外の値はパフォーマンスを低下させるため、デフォルトは nil となっています。