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

C++ 在信号处理程序中使用SIGRTMIN和SIGRTMAX安全吗?,c++,c,linux,signals,C++,C,Linux,Signals,我正在使用的代码有一个共享的信号处理程序,它可以打开信号号来适当地处理它 我正在添加一个自定义信号。像这样的 static void signal_handler (int s) { if ( s == SIGTERM ) clean_up () ; else if ( s == SIGRTMIN+1 ) ; // do nothing } SIGRTMIN和SIGRTMAX是初始化静态数据的函数调用的定义(在我在google代码搜索中看到的实现中) 信号处理程序应该是不可重

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

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

static void signal_handler (int s)
{
    if ( s == SIGTERM ) clean_up () ;

    else if ( s == SIGRTMIN+1 ) ; // do nothing
}
SIGRTMIN
SIGRTMAX
是初始化静态数据的函数调用的定义(在我在google代码搜索中看到的实现中)


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

我不知道您使用的是什么实现,但在libc中,这些函数在大多数情况下似乎只是返回一个常量静态变量

您是对的,对init()的两个调用之间可能存在竞争,但这只是将静态int初始化两次到同一个常量,这并不令人担心

而且,虽然静态变量实际上并不是常数,但它们告诉您只在程序开始时修改所述变量(我认为只有pthread真正修改了这么多)

因此,无需担心这些函数(来自allocrtsig.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)

您可能最好使用不同的信号处理程序例程,一个用于
SIGTERM
,另一个用于您的
SIGRT*
@Basile是的,我认为这是最简单的,谢谢。仍然想知道在信号处理程序中使用SIGRTMIN/MAX是安全的还是不安全的