Jay*_*ker 5 c signals signal-handling async-safe
我必须处理一个可以从大型项目中的各个地方调用的日志记录模块。我遇到的问题是,有时可能会从信号处理程序内执行的代码中调用该模块。通常,日志模块使用 localtime() 和 strftime() 包含时间数据,但当然这些调用不是异步信号安全的,如果从信号处理程序中调用,可能会导致死锁。有没有办法(在 GNU/Linux 系统上)判断我的代码当前是否在信号处理程序上下文中执行,除了例如让每个信号处理程序在处理时设置一个标志?我认为简化我们的信号处理程序会更好,但在这种情况下,我无法选择在哪里调用日志记录模块。
首先,您的问题(“我在信号处理程序中吗?”)没有明确定义的答案。考虑以下代码:
#include <setjmp.h>
#include <signal.h>
jmp_buf jb;
int foo(int s)
{
longjmp(jb,1);
}
int main()
{
if (setjmp(jb)) {
puts("Am I in a signal handler now, or not?");
return 0;
}
signal(SIGINT, foo);
raise(SIGINT);
}
Run Code Online (Sandbox Code Playgroud)
话虽如此,您可以使用一种技术以对许多程序有意义的方式回答这个问题。选择您不打算使用的信号,并将其添加到sa_mask您处理的所有信号中,使用安装信号处理程序sigaction。然后你可以用它sigprocmask来检查当前的信号掩码,如果你指定的信号在信号掩码中,则意味着信号处理程序已被调用但尚未返回(返回将恢复原始信号掩码)。