Next: プロセスからの出力の受信, Previous: プロセスへの入力の送信, Up: プロセス [Contents][Index]
サブプロセスへのシグナル送信(sending a
signal)はプロセス活動に割り込む手段の1つです。異なる複数のシグナルがあり、それぞれが独自に意味をもちます。シグナルのセットとそれらの意味はオペレーティングシステムにより定義されます。たとえばシグナルSIGINT
はユーザーがC-cをタイプしたか、それに類似する何かが発生したことを意味します。
各シグナルはサブプロセスに標準的な効果をもちます。ほとんどのシグナルはサブプロセスをkillしますが、かわりに実行を停止(や再開)するものもいくつかあります。ほとんどのシグナルはオプションでプログラムでハンドル(処理)することができます。プログラムがそのシグナルをハンドルする場合には、その影響についてわたしたちは一般的には何も言うことはできません。
このセクション内の関数を呼び出すことにより明示的にシグナルを送信できます。Emacsも特定のタイミングで自動的にシグナルを送信します。バッファーのkillにより、それに関連するプロセスにはSIGHUP
シグナル、Emacsのkillにより残されたすべてのプロセスにSIGHUP
シグナルが送信されます(SIGHUP
は通常はユーザーが“hung
up the phone”、電話を切った、つまり接続を断ったことを示す)。
シグナル送信関数はそれぞれprocessとcurrent-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-groupがnil
なら、そのシグナルはEmacs自身のサブプロセスのプロセスグループに送信されます。そのプロセスがジョブ制御shellなら、それはshell自身になります。current-groupがlambda
なら、端末を所有するもののそれ自身はshellでない場合にはプロセスグループにシグナルを送信します。
サブプロセスとの対話にpipeが使用されている際には、オペレーティングシステムがpipeの区別をサポートしないのでフラグcurrent-groupに効果はありません。同じ理由によりpipeが使用されていればジョブ制御shellは機能しないでしょう。非同期プロセスの作成のprocess-connection-type
を参照してください。
この関数はシグナルSIGINT
を送信することによりプロセスprocessに割り込む。Emacs外部ではinterrupt
character(割り込み文字。いくつかのシステムでは通常はC-c、それ以外のシステムではDEL)をタイプすることによりシグナルが送信される。引数current-groupが非nil
のときは、Emacsがサブプロセスと対話する端末上でC-cがタイプされたと考えることができる。
このコマンドはシグナルSIGKILL
を送信することにより、プロセスprocessをkillする。このシグナルは即座にサブプロセスをkillする。サブプロセスでこれをハンドルすることはできない。インタラクティブに呼び出された場合には、ユーザーにプロセス名の入力を求める(デフォルトはもしあればカレントバッファーのプロセス)。
この関数はプロセスprocessにシグナルSIGQUIT
を送信する。これはEmacs外部ではquit
character(通常はC-\)により送信されるシグナル。
この関数は指定したprocessを停止する。それがプログラムを実行中の実際のサブプロセスなら、そのサブプロセスにシグナルSIGTSTP
を送信する。processがネットワーク接続、シリアル接続、pipe接続を表す場合には、この関数はその接続から到達するデータのハンドリングを抑制する。ネットワークサーバーでは、これは新たな接続をacceptしないことを意味する。通常の実行の再開にはcontinue-process
を使用すること。
ジョブ制御をもつシステム上のEmacs外部ではstop
character(通常はC-z)がSIGTSTP
シグナルを送信する。current-groupが非nil
なら、この関数をサブプロセスとの対話にEmacsが使用する端末上でC-zがタイプされたと考えることができる。
この関数はプロセスprocessの実行を再開する。それがプログラムを実行中の実際のサブプロセスなら、そのサブプロセスにシグナルSIGCONT
を送信する。この関数はprocessが以前に停止されたとみなす。processがネットワーク接続、シリアル接続、pipe接続を表す場合には、この関数はその接続から到達するデータのハンドリングを再開する。シリアル接続ではプロセス停止中に到達したデータは失われるかもしれない。
この関数はプロセス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
にたいする引数と同じ。これらの関数はいずれかが非nil
をリターンするまでリスト順に呼び出される。このリスト上で常に最後になるデフォルトの関数はinternal-default-interrupt-process
。
これはTrampがinterrupt-process
を実装するメカニズムである。
この変数はsignal-process
用に呼び出される関数のリスト。関数の引数はsignal-process
にたいする引数と同じ。これらの関数はいずれかが非nil
をリターンするまでリスト順に呼び出される。このリスト上で常に最後になるデフォルトの関数はinternal-default-signal-process
。
これはTrampがsignal-process
を実装するメカニズムである。