9

bashに入力kill -lしてシグナルの数をプローブする場合。

32 と 33 の kill シグナルはどうなりましたか?

4

2 に答える 2

2

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 によって内部的に使用されるものは省略されています) を示しているためです。

于 2012-10-02T00:22:27.117 に答える
1

これは 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

于 2012-10-01T20:46:55.987 に答える