非同期サブプロセスからの出力は、通常はEmacsが時間の経過や端末入力のような、ある種の外部イベントを待機する間だけ到着します。特定のポイントで出力の到着を明示的に許可したり、あるいはプロセスからの出力が到着するまで待機することでさえ、Lispプログラムでは有用な場合が時折あります。
この関数はプロセスからの保留中の出力をEmacsが読み取ることを許す。この出力はプロセスのフィルター関数により与えられる。この関数はprocessが非nil
ならprocessから何らかの出力を受け取るかprocessが接続をcloseするまでリターンしない。
引数secondsとmillisecによりタイムアウトの長さを指定できる。前者は秒単位、後者はミリ秒単位でタイムアウトを指定する。この2つの秒数は、互いに足し合わせることによりタイムアウトを指定して、その秒数経過後はサブプロセスの出力が存在しなくてもリターンする。
secondsに浮動小数点数を指定することにより秒を小数点で指定できるので引数millisecは時代遅れ(であり使用するべきではない)。secondsが0ならこの関数は保留中の出力が何であれ受け取り待機しない。
processがプロセスで引数just-this-oneが非nil
ならプロセスからの出力だけが処理され、そのプロセスからの出力を受信するかタイムアウトとなるまで他のプロセスの出力は停止される。just-this-oneが整数ならタイマーの実行も抑制される。この機能は一般的には推奨されないが、音声合成のような特定のアプリケーションにとっては必要かもしれない。
関数accept-process-output
はprocess、processがnil
なら何らかのプロセスからから出力を取得したら非nil
をリターンする。これは対応する接続にバッファーされたデータが含まれていれば、たとえプロセスのexit後にも発生し得る。この関数はタイムアウトが発生したり出力の到着前に接続がcloseされるとnil
をリターンする。
プロセスからの接続にバッファーデータが含まれる場合には、プロセスのexit後でもaccept-process-output
が非nil
をリターンするかもしれません。したがって、たとえ以下のようなループでも:
;; このループにはバグがある (while (process-live-p process) (accept-process-output process))
これはprocessからすべての出力を読み取ることが頻繁にあり、接続にまだデータが含まれている間にprocess-live-p
がnil
をリターンすると競合条件をもつとともに何らかのデータが失われるかもしれません。以下のようなループを記述するほうがよいでしょう:
(while (accept-process-output process))
make-process
に非nil
のstderrを渡すと、標準エラープロセスをもつことになる。非同期プロセスの作成を参照のこと。この場合にはメインプロセスからのプロセス出力の待機は、標準エラープロセスからの出力を待機しない。プロセスからすべての標準出力と標準エラーを確実に受け取るためには、以下のコードを使用する:
(while (accept-process-output process)) (while (accept-process-output stderr-process))
make-process
のstderr引数にバッファーを渡した場合でも、以下のように標準エラープロセスを待機する必要があります:
(let* ((stdout (generate-new-buffer "stdout")) (stderr (generate-new-buffer "stderr")) (process (make-process :name "test" :command '("my-program") :buffer stdout :stderr stderr)) (stderr-process (get-buffer-process stderr))) (unless (and process stderr-process) (error "Process unexpectedly nil")) (while (accept-process-output process)) (while (accept-process-output stderr-process)))
両方のaccept-process-output
フォームがnil
をリターンしたときのみ、プロセスがexitしてEmacsがすべての出力を読み取ったと確信することができます。
この方法でリモートホスト上で実行中のプロセスからの保留中の標準エラーを読み取ることはできません。