Next: , Previous: Signals to Processes, Up: Processes


36.9 プロセスからの出力を受け取る

サブプロセスが標準出力に書く出力を受け取る方法は2つあります。 プロセスに対応付けられたバッファに出力を挿入するか、 あるいは、フィルタ関数(filter function)と呼ばれる関数を 出力に対して作用させます。 プロセスにバッファもフィルタ関数もなければ、その出力は破棄します。

サブプロセスからの出力は、Emacsが待っている、つまり、 端末入力を読んでいるとき、 sit-forsleep-forを実行中のとき(see Waiting)、 accept-process-output(see Accepting Output)を実行中のときに だけ到着します。 これにより、並行プログラムを普通は悩ますような タイミングエラーの問題を最小に抑えます。 たとえば、安全にプロセスを作成してから、 バッファかフィルタ関数を指定できます。 この処理の途中で待つような基本関数を呼び出さなければ、 出力は到着しません。

ファイルから読むテキストと同様に、 サブプロセスの出力は、バッファやフィルタ関数が受け取るまえに コーディングシステムを用いて普通は復号化します。 set-process-coding-systemで 使用するコーディングシステムを指定できます (see Process Information)。 さもなければ、coding-system-for-readnil以外であればこれを使います。 それ以外ではデフォルトの機構で決まるものを使います (see Default Coding Systems)。

警告: データからコーディングシステムを決定するundecidedのような コーディングシステムは、非同期サブプロセスの出力に対しては 完全に信頼性のある動作はできない。 これは、Emacsが非同期サブプロセスの出力が 到着するたびに一塊で処理するからである。 Emacsは1つの塊から正しい変換を検出しようと試みるが、 これがつねに動作するとは限らない。 したがって、可能な限り 文字コード変換と行末変換の両方を指定したコーディングシステムを使う。 つまり、undecidedlatin-1などではなく、 latin-1-unixのようなものを使う。