SIGNAL(9) | FreeBSD Kernel Developer's Manual | SIGNAL(9) |
名称
signal, SIGADDSET, SIGDELSET, SETEMPTYSET, SIGFILLSET, SIGISMEMBER, SIGISEMPTY, SIGNOTEMPTY, SIGSETEQ, SIGSETNEQ, SIGSETOR, SIGSETAND, SIGSETNAND, SIGSETCANTMASK, SIG_STOPSIGMASK, SIG_CONTSIGMASK, SIGPENDING, cursig, execsigs, issignal, killproc, pgsigio, postsig, sigexit, siginit, signotify, trapsignal — カーネルシグナル関数書式
#include < sys/param.h>#include < sys/proc.h>
#include < sys/signalvar.h>
void
SIGADDSET( sigset_t set, int signo);
void
SIGDELSET( sigset_t set, int signo);
void
SIGEMPTYSET( sigset_t set);
void
SIGFILLSET( sigset_t set);
int
SIGISMEMBER( sigset_t set, int signo);
int
SIGISEMPTY( sigset_t set);
int
SIGNOTEMPTY( sigset_t set);
int
SIGSETEQ( sigset_t set1, sigset_t set2);
int
SIGSETNEQ( sigset_t set1, sigset_t set2);
void
SIGSETOR( sigset_t set1, sigset_t set2);
void
SIGSETAND( sigset_t set1, sigset_t set2);
void
SIGSETNAND( sigset_t set1, sigset_t set2);
void
SIG_CANTMASK( sigset_t set);
void
SIG_STOPSIGMASK( sigset_t set);
void
SIG_CONTSIGMASK( sigset_t set);
int
SIGPENDING( struct proc *p);
int
cursig( struct thread *td);
void
execsigs( struct proc *p);
int
issignal( struct thread *td);
void
killproc( struct proc *p, char *why);
void
pgsigio( struct sigio **sigiop, int sig, int checkctty);
void
postsig( int sig);
void
sigexit( struct thread *td, int signum);
void
siginit( struct proc *p);
void
signotify( struct thread *td);
void
trapsignal( struct thread *td, int sig, u_long code);
解説
SIGADDSET() マクロは、 signo を set に追加します。 signo が有効なシグナル番号であることを保証する試みは、行なわれません。SIGDELSET() マクロは、 set から signo を取り除きます。 signo が有効なシグナル番号であることを保証する試みは、行なわれません。
SIGEMPTYSET() マクロは、 set のすべてのシグナルをクリアします。
SIGFILLSET() マクロは、 set のすべてのシグナルを設定します。
SIGISMEMBER() マクロは、 signo が set に設定されているかを確認します。
SIGISEMPTY() マクロは、 set が何かシグナルが設定されていないかを確認します。
SIGNOTEMPTY() マクロは、 set が何かシグナルを設定してるかを確認します。
SIGSETEQ() マクロは、2 つのシグナルセットが等しいかどうか確認します。すなわち、同じシグナルは、両方に設定されます。
SIGSETNEQ() マクロは、2 つのシグナルセットが異なるかどうか確認します。すなわち、任意のシグナルが 1 に設定されたなら、もう片方が設定されていない。
SIGSETOR() マクロは、 set2 のシグナルセットを set1 に論理和 (OR) します。
SIGSETAND() マクロは、 set2 のシグナルセットを set1 に論理積 (AND) します。
SIGSETNAND() マクロは、 set2 のシグナルセットを set1 に否定論理積 (NAND) します。
SIG_CANTMASK() マクロは、 set から SIGKILL と SIGSTOP シグナルをクリアします。これらの 2 つのシグナルは、ブロックすることも捕獲することができません、そして、 SIG_CANTMASK() は、シグナルがこのポリシが実行されることを保証するために操作されるコードで使用されます。
SIG_STOPSIGMASK() マクロは、 set から SIGSTOP, SIGTSTP, SIGTTIN と SIGTTOU シグナルをクリアします。 SIG_STOPSIGMASK() は、プロセスが子プロセスが終了するか、または実行しているのを待っているとき、およびプロセスがサスペンドした後に継続しているとき、停止シグナルをクリアするために使用されます。
SIG_CONTSIGMASK() マクロは、 set から SIGCONT シグナルをクリアします。 SIG_CONTSIGMASK() は、プロセスが停止しているとき、呼び出されます。
SIGPENDING() マクロは、与えられたプロセスにマスクされない保留中 (pending) のシグナルがあるかどうか確認します。プロセスに保留中のシグナルがあり、現在トレース中であるなら、 SIGPENDING() は、たとえシグナルがマスクされていても真を返します。
cursig() 関数は、プロセス td->td_proc に配信されるべきであるシグナル番号を返します。保留中のシグナルががなければ、0 が返されます。
execsigs() 関数は、 execve(2) に備えてプロセスのシグナルセットとシグナルスタックをリセットします。 p のためのプロセスロックは、 execsigs() が呼び出される前に保持されなければなりません。
issignal() 関数は、捕らえられるべきであるプロセス td->td_proc のための保留中のシグナルあるか、または、このプロセスの現在のシステムコールを終了するか、または割り込むための原因となるかを確認します。プロセス td->td_proc が現在トレースされているなら、無視されたシグナルは、取り扱われ、そして、プロセスは、常に停止されます。停止シグナルは、プロセスが親のないプロセスグループのメンバであり、停止シグナルが TTY から由来しなかったなら、すぐに issignal() によって取り扱われて、クリアされます。 td->td_proc のためのプロセススピンロックは、取得され、解放されます。 sigacts 構造体の td->td_proc->p_sigacts は、 issignal() が呼び出される前に、ロックされなければならなくて、呼び出しの間に解放され再取得されるかもしれません。 td->td_proc のためのプロセスロックは、 issignal() が呼び出される前に、取得されなければならなくて、呼び出しの間に解放され再取得されるかもしれません。デフォルトのシグナルアクションは、システムのプロセスと init のためには取られません。
killproc() 関数は、 SIGKILL を p に配信します。 why は、 なぜ プロセスが kill されたかの理由としてログ記録されます。
pgsigio() 関数は、プロセスまたはプロセスグループ sigiop->sio_pgid にシグナル sig を送ります。 checkctty が 0 でなければ、シグナルは、制御端末を持っているプロセスグループのプロセスに配信されるだけです。 sigiop->sio_pgid がプロセスグループ (> 0) のためのものであるなら、 sigiop->sio_proc のためのロックは、取得され、解放されます。 sigiop->sio_pgid がプロセスグループ (< 0) のためのものであるなら、 sigiop->sio_pgrp のためのプロセスグループロックは、取得され、解放されます。ロック sigio_lock は、取得されて解放されます。
postsig() 関数は、シグナル sig の実際の配信を取り扱います。カーネルが (フラグ PS_NEEDSIGCHK を設定させる signotify() への呼び出しを通して) シグナルが配信されるべきであると通知された後に postsig() は、 ast() から呼び出されます。 curthread を所有しているプロセスのためのプロセスロックは、 postsig() が呼び出され、現在のプロセスは、0 となるはずがない前に保持されなければなりません。現在のプロセスの p_sigacts フィールドのためのロックは、 postsig() が呼び出される前に保持しなければならなくて、解放されて、再取得されるかもしれません。
sigexit() 関数は、 td を所有しているプロセスをシグナル番号 sig の返り値で終了させます。必要なら、プロセスは、コアダンプします。 td を所有しているプロセスのためのプロセスロックは、 sigexit() が呼び出される前に、保持されなければなりません。
siginit() 関数は、 p によって無視される SA_IGNORE ( SIGCONT を除いて) のデフォルトの特性があるすべてのシグナルを引き起こすためにシステム初期化の間に呼び出されます。 p のためのプロセスロックは、sigacts 構造体 p->p_sigacts のためのロックであるように、取得され、解放されます。 siginit() がいつも呼び出される唯一のプロセスは、 proc0 です。
ast() で保留中のマスクされていないシグナルがある signotify() 関数フラグは、取り扱われるはずです。プロセス td->td_proc のためのプロセスロックは、 signotify() が呼び出される前に、保持されなければならず、スレッドロックは、取得され、解放されます。
trapsignal() 関数は、トラップの結果であるシグナルをプロセス td->td_proc に送ります。プロセスがトレースされないで、すぐにシグナルが配信できるなら、 trapsignal() は、直接それを配信します。そうでなければ、 trapsignal() は、シグナルが配信されれるのを引き起こすために psignal(9) を呼び出します。 td->td_proc のためにプロセスロックは、取得され、解放されます。 td->td_proc の p_sigacts フィールドのためのロックは、取得され、解放されます。
戻り値
SIGISMEMBER(), SIGISEMPTY(), SIGNOTEMPTY(), SIGSETEQ(), SIGSETNEQ() と SIGPENDING() マクロは、すべて、チェックしている状態が真であることがわかっているなら、0 以外 (真) を返します。そうでなければ、0 (偽) が返されます。cursig() 関数は、有効なシグナル番号または 0 のいずれかを返します。
issignal() は、有効なシグナル番号または 0 のいずれかを返します。
作者
このマニュアルページは、 <davidc@FreeBSD.org>によって書かれました。June 8, 2013 | FreeBSD |