
読み続けるとsignal(7)
わかります:2つ、しかし一度:3つはリアルタイム信号システム用に予約されているため、使用しないでください。
リアルタイム信号
Linuxは、もともとPOSIX.1bリアルタイム拡張(現在POSIX.1-2001に含まれています)で定義されたリアルタイム信号をサポートします。サポートされるリアルタイム信号の範囲は
SIGRTMIN
マクロとによって定義されますSIGRTMAX
。 POSIX.1-2001では、少なくともPOSIX_RTSIG_MAX(8)
リアルタイム信号をサポートする実装が必要です。Linuxカーネルは、33から64まで番号が付けられた32のリアルタイム信号をサポートします。ただし、
glibc
POSIXスレッド実装は、内部的に2つ(NPTLの場合)または3つ(LinuxThreadsの場合)のリアルタイム信号(参考資料を参照pthreads(7)
)を使用して値を適切にSIGRTMIN
(34または35に)調整します。使用可能なリアルタイム信号の範囲はglibc
スレッドの実装に応じて変更されます(この変更は使用可能なカーネルとglibcによって実行時に発生する可能性があります)、実際にはリアルタイム信号の範囲はUNIXシステムによって異なります。ライブ信号を参照するためにハードコードされた数字を使用しないでください。ただし、常にシンボルを使用してライブ信号を参照し、SIGRTMIN+n
それを超えない適切な(ランタイム)チェックを含める必要があります。SIGRTMIN+n
SIGRTMAX
もしそうなら、プログラムが実行されているときに(自己および子項目の信号処理を設定する必要があるCプログラムで)SIGRTMIN値をどのように決定しますか?ここにある質問と回答を見てみましたが、みんなSIGRTMIN
ページにしてはいけないことだと書かれている時だと思うようです#define SIGRTMIN 34
!man
答え1
#define
そんな風に書かないとdアイテムが一定ではないことを愚かに忘れてしまいました!
@RuiFRibeiroが指摘したように/usr/include/
アーキテクチャ別/bits/signum.h
下部のインクルードファイルは、必要なものを提供するマクロペアです。
#define SIGUNUSED 31
#define _NSIG 65 /* Biggest signal number + 1
(including real-time signals). */
#define SIGRTMIN (__libc_current_sigrtmin ())
#define SIGRTMAX (__libc_current_sigrtmax ())
/* These are the hard limits of the kernel. These values should not be
used directly at user level. */
#define __SIGRTMIN 32
#define __SIGRTMAX (_NSIG - 1)
これで、シグナルハンドラが残っているハンドラに置き換えられるのを防ぐ方法がわかりました。すべての試みが拒否されると思います。しかし、バグ報告の場合、限界を確認しようとするよりも限界が何であるかを知る方がよいでしょう。どのように!