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是安全的还是不安全的