我正在使用的代码有一个共享信号处理程序,可以打开信号编号来正确处理它。
我正在添加自定义信号。像这样的东西
static void signal_handler (int s)
{
if ( s == SIGTERM ) clean_up () ;
else if ( s == SIGRTMIN+1 ) ; // do nothing
}
SIGRTMIN
和SIGRTMAX
是函数调用的#defines,用于初始化静态数据(在我在谷歌代码搜索中看到的实现中)
信号处理程序应该是不可重入的。在SIGRTMIN
和SIGRTMAX
的访问器中使用静态数据是否会使这些宏在信号处理程序中使用不安全?
答案 0 :(得分:4)
我不知道你吸烟的实现是什么,但是在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)