なぜ `kill -l`は32と33のシグナル番号をリストしないのですか?


18

kill -lLinuxで実行すると、以下が得られます。

 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

何に起こった3233?なぜ記載されていないのですか?途中で2をスキップする代わりに、1で開始して62で終了することもできましたか?


PS「エラーコード」はありません-それらはシグナル番号です。
Gマンは「Reinstate Monica」と言います

回答:


20

NPTLが原因です。GNU Cライブラリの一部であるため、ほとんどすべての最新のLinuxディストリビューションは、最初の2つのリアルタイムシグナルを使用しなくなりました。NPTLはPOSIX Threadsの実装です。NPTLは、最初の2つのリアルタイム信号を内部で使用します。

シグナルマンページのこの部分は非常に興味深いものです。

Linuxカーネルは、33から64番までの32種類のさまざまなリアルタイム信号をサポートしています。ただし、glibc POSIXスレッドの実装は、内部で2(NPTLの場合)または3(LinuxThreadsの場合)のリアルタイム信号を使用します(pthreads(7)を参照) 、SIGRTMINの値を適切に(34または35に)調整します。利用可能なリアルタイム信号の範囲はglibcスレッドの実装によって異なり(この変動は利用可能なカーネルとglibcによって実行時に発生する可能性があります)、実際にリアルタイム信号の範囲はUNIXシステムによって異なるため、プログラムはハードコードされた数値を使用してリアルタイム信号を参照することはありませんが、代わりに常に表記SIGRTMIN + nを使用してリアルタイム信号を参照し、SIGRTMIN + nがSIGRTMAXを超えない適切な(実行時)チェックを含める必要があります。

glibcのソースコードも確認しました。行22を参照してください。__SIGRTMIN+2が増加するため、最初の2つのリアルタイム信号はリアルタイム信号の範囲から除外されます。


では、実行中のコードで実行時にSIGRTMINの現在の値をどのように取得するのでしょうか?
SlySven

10

信号は次のとおりです。

SIGWAITING 32 Ignore All LWPs blocked 
    SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library 

どちらもLinuxではサポートされていません。(LWPはLightWeight Processの略です)

出典:IBM DeveloperWorks Solaris to Linux Porting Guide


:Linuxは、信号32及び33を参照してくださいましたunixhelp.ed.ac.uk/CGI/man-cgi?signal+7Real-time Signalsセクションを。
クオンルム14

@Gnouc- kill -l RTMINあなたが参照したドキュメントによると32ではなく34 から始まります。これは33から始まると言いますが、番号はglibcスレッドの実装に応じて異なる可能性があるため、番号で参照するべきではないと述べています。
garethTheRed 14

もちろん、システムによって異なりますが、Linuxがサポートしないという用語は間違っています。これを参照できます:cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/…。シグナル32、33で何が起こるかを知らせるために、ずっと前にLinuxで働いていたベレランが必要なのかもしれません。なぜ文書化されていないのですか。
cuonglm 14

これらはRT pthreadライブラリによって内部的に使用されます。過去には、2つではなく3つのシステムが使用されていました。コーディングの観点からは、SIGSYSの上の信号にコンパイル時定数を使用することは想定されていません。たとえばSIGRTMIN#define行のセットは、実行可能ファイルの実行時に変更される可能性があるためです。これは、数年前に、一方のpthreadライブラリに対してコンパイルされたアプリケーションが他方で再起動されたシステムで実行された場合、両方のpthreadライブラリが使用されていたときに現れます。
SlySven
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.