SIGRTMIN和SIGRTMAX在信号处理程序中使用安全吗?

Are SIGRTMIN and SIGRTMAX safe to use in signal handlers?

本文关键字:安全 程序 SIGRTMAX 信号处理 SIGRTMIN      更新时间:2023-10-16

我正在使用的代码有一个共享的信号处理程序,该处理程序打开信号号以适当地处理它。

我正在添加一个自定义信号。像这样

static void signal_handler (int s)
{
    if ( s == SIGTERM ) clean_up () ;
    else if ( s == SIGRTMIN+1 ) ; // do nothing
}

SIGRTMINSIGRTMAX是初始化静态数据的函数调用的#定义(在我在google代码搜索中看到的实现)

信号处理程序应该是不可重入的。在SIGRTMINSIGRTMAX的访问器中使用静态数据是否使这些宏在信号处理程序中使用不安全?

我不知道您在使用什么实现,但在libc中,这些函数似乎只是在大多数时候返回一个恒定的静态变量。

你是对的,在对init()的两次调用之间可能存在竞争,但这只是将一个静态int初始化为同一个常量两次,几乎不用担心。

并且,虽然静态变量不是真正的常量,但它们告诉您只在程序开始时修改该变量(我认为只有pthread真正对其进行了那么多修改)。

所以不用担心这些函数(来自allocrtssig .c glibc 2.14)。

并且,如果您真的很担心,只需在绑定信号处理程序之前调用SIGRTMIN一次。这将使init()函数不再碍事。

/* Return number of available real-time signal with highest priority.  */
int __libc_current_sigrtmin (void)
{
#ifdef __SIGRTMIN
  if (!initialized)
    init ();
#endif
  return current_rtmin;
}
libc_hidden_def (__libc_current_sigrtmin)
/* Return number of available real-time signal with lowest priority.  */
int __libc_current_sigrtmax (void)
{
#ifdef __SIGRTMIN
  if (!initialized)
    init ();
#endif
  return current_rtmax;
}
libc_hidden_def (__libc_current_sigrtmax)