【问题标题】:What has happened to the 32 and 33 kill signals?32 和 33 杀戮信号发生了什么?
【发布时间】:2012-09-22 17:39:50
【问题描述】:

如果在 bash 中输入 kill -l 并探测信号数。

32 和 33 杀戮信号发生了什么变化?

【问题讨论】:

  • 不同架构的信号数量略有不同,由 ABI 固定。 Bash 与他们没有什么特别的关系。你有什么问题?
  • 我的问题是,为什么至少在 CENTOS 中,kill 命令没有 31 和 32 选项。一定是有目的的,否则开发人员不会简单地将上面的数字向下移动两位吗?

标签: linux bash kill


【解决方案1】:

POSIX realtime signals 选项定义了一组从SIGRTMINSIGRTMAX 的信号,它们具有各种有用的属性(例如,它们具有明确定义的交付优先级——最低信号编号优先——以及相同的多个实例信号可以通过sigqueue() 排队并与参数相关联。这些是由内核使用信号编号 32 向上实现的。

但是 POSIX 不要求 SIGRTMINSIGRTMAX 是用户级代码的编译时常量,而在 GNU libc 中它们不是:如果您使用用户级 <signal.h> 放置源文件通过预处理器(例如使用gcc -E),您会看到SIGRTMIN 实际上扩展为(__libc_current_sigrtmin())

implementation of this inside glibc 保留至少内核支持的前两个值,用于其内部用途。其中第一个(最高优先级的此类信号)用于支持线程取消处理;第二个用于与setuid 的实现相关的内容。 (请参阅here。我不确定在什么情况下会利用分配更多信号供内部使用的能力。)

因此,缺少信号编号是由于bash 向您显示了应用程序的可用信号视图(忽略了 glibc 内部使用的信号),而不是内核的视图。

【讨论】:

    【解决方案2】:

    这不是 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
    

    这证实了SIGRTMINSIGRTMAX 是最大的信号并且两者都具有32 值。

    man 7 signals中有关信号的更多信息

    【讨论】:

      猜你喜欢
      • 2015-08-25
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-04
      • 2016-03-01
      • 1970-01-01
      • 2014-10-03
      相关资源
      最近更新 更多