Next: , Previous: Output from Processes, Up: Processes


36.10 番兵:プロセスの状態変化の検出

プロセスの番兵(process sentinel)は、 プロセスを終了/一時停止/継続させる (Emacsが送ったかプロセス自身の動作によって生起した)シグナルを含めて 対応付けられたプロセスの状態が任意の理由で変化したときに 呼び出される関数です。 プロセスの番兵は、プロセスが終了しても呼び出されます。 番兵は2つの引数、事象が発生したプロセスと 事象の種類を記述する文字列を受け取ります。

事象を記述する文字列はつぎのとおりです。

番兵はEmacsが(たとえば、端末入力や時間経過、プロセスの出力を) 待っているときにのみ実行されます。 他のLispプログラムの実行途中で無秩序に番兵を実行した場合に起こる タイミングエラーを回避するためです。 sit-forsleep-for(see Waiting)、あるいは、 accept-process-output(see Accepting Output)を 呼び出すとプログラムは待ちに入り、番兵が動けることになります。 Emacsは、コマンドループで入力を読むときにも番兵の実行を許します。

番兵の内側では中断は普通は禁止されています。 さもないと、コマンドレベルで打ったC-gの効果や、 ユーザーコマンドを中断するために打ったC-gの効果は予測できません。 番兵の内側で中断を行いたい場合には、 inhibit-quitnilを束縛します。 See Quitting

プロセスのバッファに出力を書き込む番兵は、 そのバッファが有効であるかどうかを検査するべきです。 無効なバッファに挿入しようとするとエラーになります。 バッファが無効であれば、 式(buffer-name (process-buffer process)) を実行するとnilを返します。

番兵の実行中にエラーが発生するとそのエラーは自動的に捕捉され、 番兵を始動したときに動いていた プログラムの実行を停止しないようにします。 しかし、debug-on-errornil以外であると、 エラーを捕捉しません。 これにより、Lispデバッガで番兵をデバッグできます。 See Debugger

Emacsの初期の版では、正規表現を探索したり一致処理する番兵では、 マッチデータを明示的に保存/復元する必要がありました。 今のEmacsは、番兵に対してはこれを自動的に行いますから、 番兵で明示的に行う必要はありません。 See Match Data

— Function: set-process-sentinel process sentinel

この関数は、プロセスprocessに番兵sentinelを対応付ける。 sentinelnilであると、プロセスに番兵はない。 番兵がない場合のデフォルトのふるまいは、 プロセス状態が変化するとプロセスのバッファにメッセージを挿入する。

          (defun msg-me (process event)
             (princ
               (format "Process: %s had the event `%s'" process event)))
          (set-process-sentinel (get-process "shell") 'msg-me)
                msg-me
          (kill-process (get-process "shell"))
               -| Process: #<process shell> had the event `killed'
                #<process shell>
— Function: process-sentinel process

この関数は、プロセスprocessの番兵を返すか、 番兵がなければnilを返す。

— Function: waiting-for-user-input-p

番兵やフィルタ関数が動作中にこの関数を呼び出すと、 番兵やフィルタ関数を呼び出したときにEmacsがユーザーからの キーボード入力を待ってるとnil以外を返し、 それ以外ではnilを返す。