Next: Transaction Queues, Previous: Output from Processes, Up: Processes
プロセスの番兵(process sentinel)は、 プロセスを終了/一時停止/継続させる (Emacsが送ったかプロセス自身の動作によって生起した)シグナルを含めて 対応付けられたプロセスの状態が任意の理由で変化したときに 呼び出される関数です。 プロセスの番兵は、プロセスが終了しても呼び出されます。 番兵は2つの引数、事象が発生したプロセスと 事象の種類を記述する文字列を受け取ります。
事象を記述する文字列はつぎのとおりです。
"finished\n"
.
"exited abnormally with code
exitcode\n"
.
"
name-of-signal\n"
.
"
name-of-signal (core dumped)\n"
.
番兵はEmacsが(たとえば、端末入力や時間経過、プロセスの出力を)
待っているときにのみ実行されます。
他のLispプログラムの実行途中で無秩序に番兵を実行した場合に起こる
タイミングエラーを回避するためです。
sit-for
やsleep-for
(see Waiting)、あるいは、
accept-process-output
(see Accepting Output)を
呼び出すとプログラムは待ちに入り、番兵が動けることになります。
Emacsは、コマンドループで入力を読むときにも番兵の実行を許します。
番兵の内側では中断は普通は禁止されています。
さもないと、コマンドレベルで打ったC-gの効果や、
ユーザーコマンドを中断するために打ったC-gの効果は予測できません。
番兵の内側で中断を行いたい場合には、
inhibit-quit
にnil
を束縛します。
See Quitting。
プロセスのバッファに出力を書き込む番兵は、
そのバッファが有効であるかどうかを検査するべきです。
無効なバッファに挿入しようとするとエラーになります。
バッファが無効であれば、
式(buffer-name (process-buffer
process))
を実行するとnil
を返します。
番兵の実行中にエラーが発生するとそのエラーは自動的に捕捉され、
番兵を始動したときに動いていた
プログラムの実行を停止しないようにします。
しかし、debug-on-error
がnil
以外であると、
エラーを捕捉しません。
これにより、Lispデバッガで番兵をデバッグできます。
See Debugger。
Emacsの初期の版では、正規表現を探索したり一致処理する番兵では、 マッチデータを明示的に保存/復元する必要がありました。 今のEmacsは、番兵に対してはこれを自動的に行いますから、 番兵で明示的に行う必要はありません。 See Match Data。
この関数は、プロセスprocessに番兵sentinelを対応付ける。 sentinelが
nil
であると、プロセスに番兵はない。 番兵がない場合のデフォルトのふるまいは、 プロセス状態が変化するとプロセスのバッファにメッセージを挿入する。(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>