bashに入力kill -l
してシグナルの数をプローブする場合。
32 と 33 の kill シグナルはどうなりましたか?
POSIX リアルタイム シグナルオプションは、さまざまな有用なプロパティを持つ からSIGRTMIN
までの一連のシグナルを定義しSIGRTMAX
ます (たとえば、シグナルには明確に定義された配信優先順位があり、最も小さいシグナル番号が最初に設定されます)、同じシグナルの複数のインスタンスをキューに入れ、1 つのシグナルに関連付けることができます。パラメータ、経由sigqueue()
)。これらは、32 以上のシグナル番号を使用してカーネルによって実装されます。
しかし、POSIX は、ユーザーランドコードのコンパイル時定数を必要SIGRTMIN
とせずSIGRTMAX
、GNU libc ではそうではありません: ユーザーランドを使用してソースファイルを<signal.h>
プリプロセッサ (たとえばgcc -E
) を介して配置すると、次のようになります。SIGRTMIN
実際には に展開されます(__libc_current_sigrtmin())
。
これを glibc 内に実装すると、少なくともカーネルがサポートする最初の 2 つの値が独自の内部目的のために予約されます。それらの最初のもの (そのようなシグナルの優先度が最も高い) は、スレッドのキャンセル処理をサポートするために使用されます。2 番目は の実装に関連するものに使用されsetuid
ます。(こちらを参照してください。内部使用のためにさらにシグナルを割り当てる機能がどのような状況で利用されるのかはわかりません。)
したがって、シグナル番号が欠落しているbash
のは、カーネルのビューではなく、利用可能なシグナルのアプリケーションのビュー (glibc によって内部的に使用されるものは省略されています) を示しているためです。
これは Centos に焦点を当てたものではありません。archlinux には次のものがあります。
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
ご覧のとおり、オーバーしたもの31
は常に同じ信号SIGRTMAX
で、いくつかのバリエーションがあります。
さらに、見つけたソースファイル/usr/include/asm/signal.h
で:
#define NSIG 32
typedef unsigned long sigset_t;
#endif /* __ASSEMBLY__ */
#define SIGHUP 1
#define SIGINT 2
#define SIGQUIT 3
#define SIGILL 4
#define SIGTRAP 5
#define SIGABRT 6
#define SIGIOT 6
#define SIGBUS 7
#define SIGFPE 8
#define SIGKILL 9
#define SIGUSR1 10
#define SIGSEGV 11
#define SIGUSR2 12
#define SIGPIPE 13
#define SIGALRM 14
#define SIGTERM 15
#define SIGSTKFLT 16
#define SIGCHLD 17
#define SIGCONT 18
#define SIGSTOP 19
#define SIGTSTP 20
#define SIGTTIN 21
#define SIGTTOU 22
#define SIGURG 23
#define SIGXCPU 24
#define SIGXFSZ 25
#define SIGVTALRM 26
#define SIGPROF 27
#define SIGWINCH 28
#define SIGIO 29
#define SIGPOLL SIGIO
/*
#define SIGLOST 29
*/
#define SIGPWR 30
#define SIGSYS 31
#define SIGUNUSED 31
/* These should not be considered constants from userland. */
#define SIGRTMIN 32
#define SIGRTMAX _NSIG
SIGRTMIN
これにより、 &SIGRTMAX
が最大のシグナルであり、32
両方の値を持つことが確認されます。
信号の詳細情報man 7 signals