Next: Processes and Threads, Previous: Decoding Output, Up: Output from Processes [Contents][Index]
非同期サブプロセスからの出力は、通常は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))