SIGRTMIN和SIGRTMAX在信号处理程序中使用安全吗?
Are SIGRTMIN and SIGRTMAX safe to use in signal handlers?
我正在使用的代码有一个共享的信号处理程序,该处理程序打开信号号以适当地处理它。
我正在添加一个自定义信号。像这样
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真正对其进行了那么多修改)。
所以不用担心这些函数(来自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)
相关文章:
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 安全回调提供程序(SFINAE,std::正向和过载解析)
- 如何使用winsock在c++应用程序中实现安全套接字通信
- 窗口上信号处理程序的异步安全写入函数
- 如何以编程方式查找 Windows 上的活动安全提供程序
- 程序流并以安全而雄辩的方式正确返回Main()
- 使用Microsoft安全支持提供程序接口 (SSPI) 对消息进行加密和签名
- 正在通过程序安全连接到MySQL
- 在多线程程序中使用动态数组的头段安全吗
- LLVM:在程序内实现安全的多实例环境
- 基于局域网的应用程序和安全通道身份验证
- 可以归类为病毒的程序可能存在安全缺陷
- 内联 asm 分配给"FS:0":处理程序未注册为安全处理程序
- 在退出应用程序时安全退出Qt线程
- 在asio stackful协同程序中直接使用产卵是否安全
- 在程序中运行gcc的安全、跨平台的方式
- 单线程安全程序
- 如何以线程安全的方式退出 C++03 中的程序
- 安全使用来自程序不同部分的实体
- Cassandra 会话线程安全吗?(使用 CPP 驱动程序)