PSIGNAL(9)

名称
psignal, pgsignal, gsignal - プロセスへのシグナル送出

書式
void psignal(struct proc *p, int signum) void pgsignal(struct pgrp *pgrp, int signum, int checkctty) void gsignal(int pgid, int signum)

解説
これらの関数は、一つまたはそれ以上のプロセスへシグナルを送ります。 3 つの関数共通な引数 signum は、 [1-NSIG] の範囲内であるべきです。

関数 psignal() は、 プロセス構造体 p が示すプロセスへ シグナル番号 signum のシグナルを送ります。 (いくつかの例外がありますが、それは後ほど述べるとして、) ターゲットとなるプロセスのシグナル処理が更新され、プログラムは RUN 状態に マークされます。その後のコンテクストスイッチの後、ターゲットプロセスのコンテクスト内で そのシグナルは処理されます。留意すべき点は、 psignal() 自身がコンテクストスイッチを起こすわけではないという点です。

ターゲットプロセスが RUN 状態にマークされないのは以下のような場合です:

•   ターゲットプロセスが割り込み不可状態で sleep してる場合。 シグナルはプロセスがシステムコールや trap から return した時に通知されます。

•   ターゲットプロセスがシグナルを無視するように設定されている場合。

•   sleep 中のプロセスに stop シグナルを送って、デフォルトのアクションが起こる場合 (see sigaction(2)) 、そのプロセスは、起きることなく stop したままです。

•   シグナルアクションにかかわらず (たとえばシグナルアクションが blocked や ignored の場合) 、 SIGCONT がストップしているプロセスを再スタートする (か、再び sleep 状態へ戻る) 場合

もしターゲットプロセスがデバッグトレース状態であるなら、 psignal() は、 signum に対してデフォルトアクションが定義されているように振舞います。 このことは、トレースしているプロセス(親プロセス)に シグナルを通知させることを可能にします。

関数 pgsignal() は、 pgrp で示されるプロセスグループの各メンバにシグナル番号 signum を送ります。 もし、 checkctty が非ゼロならば、シグナルは制御端末を持つプロセスにのみ送られます。 pgsignal() は プロセスグループ構造体 pgrp の pg_members フィールドで指し示されるプロセスリストを辿りつつ、それらのプロセスに psignal() を適切に呼ぶことで実装されています。 もし pgrp が NULL ならば、何も行われません。

関数 gsignal() は、グループID pgid で示されるプロセスグループの各メンバに シグナル番号 signum を送ります。 gsignal() は、まず最初に pgid で示されるプロセスグループを見つけ、 そのプロセスグループに対して、 引数 checkctty に 0 を入れて pgsignal() を呼びます。 もし pgid がゼロならば、何も行われません。

関連項目
sigaction(2), tsleep(9)