サブプロセスにシグナルを送信することは、その動作を中断させる一つの方法です。シグナルにはいくつかの種類があり、それぞれに固有の意味があります。シグナルのセットとその名称は、オペレーティングシステムによって定義されています。例えば、シグナル
SIGINT は、ユーザーが C-c
を入力したか、あるいはそれに類する事象が発生したことを意味します。
各シグナルは、サブプロセスに対して標準的な影響を及ぼす。ほとんどのシグナルはサブプロセスを強制終了させるが、中には代わりに実行を停止(または再開)させるものもある。ほとんどのシグナルは、プログラムによって任意に処理することが可能である。プログラムがシグナルを処理する場合、その影響について一般的に述べることはできない。
本節の関数を呼び出すことで、明示的にシグナルを送信できます。また、Emacsは特定のタイミングで自動的にシグナルを送信します。バッファを終了すると、それに関連付けられたすべてのプロセスにSIGHUPシグナルが送信され、Emacsを終了すると、残っているすべてのプロセスにSIGHUPシグナルが送信されます。(SIGHUPは通常、ユーザーが「電話を切った」、つまり切断したことを示すシグナルです。)
各信号送信関数は、process と current-group という2つのオプション引数を取ります。
引数 process は、プロセス、プロセス名、バッファ、バッファ名、または nil のいずれかである必要があります。バッファまたはバッファ名は、get-buffer-process までのプロセスを表します。nil は、現在のバッファに関連付けられたプロセスを表します。stop-process および continue-process を除き、process
がアクティブなプロセスを指さない場合、またはネットワーク、シリアル、パイプ接続を表す場合には、エラーが通知されます。
引数 current-group は、Emacs
のサブプロセスとしてジョブ制御シェルを実行している場合に挙動を左右するフラグです。これが nil
以外の場合、シグナルは Emacs
がサブプロセスとの通信に使用するターミナルの現在のプロセスグループに送信されます。そのプロセスがジョブ制御シェルである場合、これはシェルの現在のサブジョブを意味します。current-group が nil の場合、シグナルは
Emacs の直属のサブプロセスのプロセスグループに送信されます。そのサブプロセスがジョブ制御シェルである場合、これはシェル自身を指します。current-group が lambda
の場合、シグナルはターミナルを所有するプロセスグループに送信されますが、これはシェル自身ではない場合に限られます。
パイプを用いてサブプロセスと通信する場合、オペレーティングシステムがパイプにおける区別をサポートしていないため、フラグ current-group
は効果を発揮しません。同様の理由で、パイプを使用するとジョブ制御シェルは動作しません。非同期プロセスの作成 の process-connection-type を参照してください。
この関数は、シグナル SIGINT を送信することでプロセス process を中断します。Emacs 以外では、中断文字(システムによっては通常 C-c、また別のシステムでは DEL)を入力することで、このシグナルが送信されます。引数 current-group が nil
以外の場合、この関数は、Emacs がサブプロセスと通信する際に使用する端末で C-c
を入力することと同等であると考えることができます。
このコマンドは、シグナル SIGKILL を送信することでプロセス process
を終了させます。このシグナルはサブプロセスを即座に終了させ、サブプロセス側で処理することはできません。対話モードでは、ユーザーにプロセス名の入力を求め、デフォルトでは現在のバッファにあるプロセス(もしあれば)が指定されます。
この関数は、プロセス process にシグナル SIGQUIT を送信します。このシグナルは、Emacs 外にいるときに終了文字(通常は C-\)によって送信されるものです。
この関数は、指定された process
を停止します。それがプログラムを実行中の実際のサブプロセスである場合、そのサブプロセスにシグナル SIGTSTP を送信します。process
がネットワーク、シリアル、またはパイプ接続を表す場合、この関数はその接続からの受信データの処理を抑制します。ネットワークサーバーの場合、これは新規接続を受け付けないことを意味します。通常の実行を再開するには
continue-process を使用してください。
Emacs以外で、ジョブ制御機能を持つシステムでは、停止文字(通常は C-z)は通常、サブプロセスに
SIGTSTP シグナルを送信します。current-group が nil
でない場合、この関数は、Emacsがサブプロセスと通信するために使用するターミナルに C-z
を入力することに相当すると考えることができます。
この関数は、プロセス process
の実行を再開します。プログラムを実行している実際のサブプロセスである場合、そのサブプロセスにシグナル SIGCONT を送信します。これは、事前に process
が停止されていたことを前提としています。process
がネットワーク、シリアル、またはパイプ接続を表す場合、この関数はその接続からの受信データの処理を再開します。シリアル接続の場合、プロセスが停止していた間に受信したデータが失われる可能性があります。
この関数は、プロセス process にシグナルを送信します。引数 signal で送信するシグナルを指定します。値は整数、または名称がシグナルであるシンボルである必要があります。
process 引数にはシステムプロセスの ID(整数)を指定できます。これにより、Emacs の子プロセスではないプロセスにシグナルを送信できます。他のプロセスへのアクセスを参照してください。
process がプロパティ remote-pid
を持つプロセスオブジェクトである場合、あるいは process が数値で remote がリモートファイル名である場合、process
はそれぞれのリモートホスト上のプロセスとして解釈され、それがシグナルを送信するプロセスとなります。
process が文字列の場合、対応するプロセス名を持つプロセスオブジェクト、または数値として解釈されます。
非ローカルな非同期プロセスにシグナルを送信する必要がある場合があります。これは、独自の interrupt-process または signal-process 実装を記述することで実現可能です。その後、この関数をそれぞれ interrupt-process-functions または signal-process-functions に追加する必要があります。
この変数は、interrupt-process に対して呼び出される関数のリストです。関数の引数は
interrupt-process の場合と同様です。これらの関数は、いずれかが non-nil を返すまで、リストの順に呼び出されます。このリストの最後に必ず配置されるデフォルトの関数は internal-default-interrupt-process です。
これが仕組みで、トランプがinterrupt-processを実装している方法です。
この変数は、signal-process に対して呼び出される関数のリストです。関数の引数は
signal-process の場合と同様です。これらの関数は、いずれかが non-nil を返すまで、リストの順に呼び出されます。このリストの最後に必ず配置されるデフォルトの関数は internal-default-signal-process です。
これが仕組みで、トランプがsignal-processを実装している方法です。