Next: , Previous: , Up: プロセス   [Contents][Index]


40.8 プロセスへのシグナルの送信

サブプロセスへのシグナル送信(sending a signal)はプロセス活動に割り込む手段の1つです。異なる複数のシグナルがあり、それぞれが独自に意味をもちます。シグナルのセットとそれらの意味はオペレーティングシステムにより定義されます。たとえばシグナルSIGINTはユーザーがC-cをタイプしたか、それに類似する何かが発生したことを意味します。

各シグナルはサブプロセスに標準的な効果をもちます。ほとんどのシグナルはサブプロセスをkillしますが、かわりに実行を停止(や再開)するものもいくつかあります。ほとんどのシグナルはオプションでプログラムでハンドル(処理)することができます。プログラムがそのシグナルをハンドルする場合には、その影響についてわたしたちは一般的には何も言うことはできません。

このセクション内の関数を呼び出すことにより明示的にシグナルを送信できます。Emacsも特定のタイミングで自動的にシグナルを送信します。バッファーのkillにより、それに関連するプロセスにはSIGHUPシグナル、Emacsのkillにより残されたすべてのプロセスにSIGHUPシグナルが送信されます(SIGHUPは通常はユーザーが“hung up the phone”、電話を切った、つまり接続を断ったことを示す)。

シグナル送信関数はそれぞれprocesscurrent-groupいう2つのオプション引数を受け取ります。

引数processはプロセス、プロセス名、バッファー、バッファー名、またはnilのいずれかでなければなりません。バッファーやバッファー名はget-buffer-processを通じて得られるプロセスを意味します。nilはカレントバッファーに関連付けられたプロセスを意味します。stop-process and continue-processを除いて、processがプロセスを識別しない、あるいはネットワーク接続、シリアル接続、pipe接続を表す場合にはエラーがシグナルされます。

引数current-groupは、Emacsのサブプロセスとしてジョブ制御shell(job-control shell)を実行中の場合に異なる処理を行うためのフラグです。これが非nilなら、そのシグナルはEmacsがサブプロセスとの対話に使用する端末のカレントプロセスグループに送信されます。そのプロセスがジョブ制御shellなら、これはそのshellのカレントのsubジョブになります。current-groupnilなら、そのシグナルはEmacs自身のサブプロセスのプロセスグループに送信されます。そのプロセスがジョブ制御shellなら、それはshell自身になります。current-grouplambdaなら、端末を所有するもののそれ自身はshellでない場合にはプロセスグループにシグナルを送信します。

サブプロセスとの対話にpipeが使用されている際には、オペレーティングシステムがpipeの区別をサポートしないのでフラグcurrent-groupに効果はありません。同じ理由によりpipeが使用されていればジョブ制御shellは機能しないでしょう。非同期プロセスの作成process-connection-typeを参照してください。

Function: interrupt-process &optional process current-group

この関数はシグナルSIGINTを送信することによりプロセスprocessに割り込む。Emacs外部ではinterrupt character(割り込み文字。いくつかのシステムでは通常はC-c、それ以外のシステムではDEL)をタイプすることによりシグナルが送信される。引数current-groupが非nilのときは、Emacsがサブプロセスと対話する端末上でC-cがタイプされたと考えることができる。

Command: kill-process &optional process current-group

このコマンドはシグナルSIGKILLを送信することにより、プロセスprocessをkillする。このシグナルは即座にサブプロセスをkillする。サブプロセスでこれをハンドルすることはできない。インタラクティブに呼び出された場合には、ユーザーにプロセス名の入力を求める(デフォルトはもしあればカレントバッファーのプロセス)。

Function: quit-process &optional process current-group

この関数はプロセスprocessにシグナルSIGQUITを送信する。これはEmacs外部ではquit character(通常はC-\)により送信されるシグナル。

Function: stop-process &optional process current-group

この関数は指定したprocessを停止する。それがプログラムを実行中の実際のサブプロセスなら、そのサブプロセスにシグナルSIGTSTPを送信する。processがネットワーク接続、シリアル接続、pipe接続を表す場合には、この関数はその接続から到達するデータのハンドリングを抑制する。ネットワークサーバーでは、これは新たな接続をacceptしないことを意味する。通常の実行の再開にはcontinue-processを使用すること。

ジョブ制御をもつシステム上のEmacs外部ではstop character(通常はC-z)がSIGTSTPシグナルを送信する。current-groupが非nilなら、この関数をサブプロセスとの対話にEmacsが使用する端末上でC-zがタイプされたと考えることができる。

Function: continue-process &optional process current-group

この関数はプロセスprocessの実行を再開する。それがプログラムを実行中の実際のサブプロセスなら、そのサブプロセスにシグナルSIGCONTを送信する。この関数はprocessが以前に停止されたとみなす。processがネットワーク接続、シリアル接続、pipe接続を表す場合には、この関数はその接続から到達するデータのハンドリングを再開する。シリアル接続ではプロセス停止中に到達したデータは失われるかもしれない。

Command: signal-process process signal &optional remote

この関数はプロセスprocessにシグナルを送信する。引数signalはどのシグナルを送信するかを指定する。これは整数、または名前がシグナルであるようなシンボルであること。

process引数にはシステムプロセスID (整数)を指定できる。これによりEmacsの子プロセス以外のプロセスにシグナルを送信できる。別のプロセスへのアクセスを参照のこと。

processがプロパティremote-pidをもつプロセスオブジェクト、あるいはprocessが数値でremoteがリモートファイル名の場合には、processはプロセスにシグナルを送信するリモートホスト上のプロセスとして解釈される。

processが文字列の場合には、そのプロセス名あるいはプロセス番号のプロセスオブジェクトと解釈される。

非ローカルな非同期プロセスへのシグナル送信が必要になることがあります。これはinterrupt-processおよびsignal-processにたいして実装を独自に記述することにより可能です。それからそれらの関数をそれぞれinterrupt-process-functionsおよびsignal-process-functionsに追加する必要があります。

Variable: interrupt-process-functions

この変数はinterrupt-process用に呼び出される関数のリスト。関数の引数はinterrupt-processにたいする引数と同じ。これらの関数はいずれかが非nilをリターンするまでリスト順に呼び出される。このリスト上で常に最後になるデフォルトの関数はinternal-default-interrupt-process

これはTrampがinterrupt-processを実装するメカニズムである。

Variable: signal-process-functions

この変数はsignal-process用に呼び出される関数のリスト。関数の引数はsignal-processにたいする引数と同じ。これらの関数はいずれかが非nilをリターンするまでリスト順に呼び出される。このリスト上で常に最後になるデフォルトの関数はinternal-default-signal-process

これはTrampがsignal-processを実装するメカニズムである。