gpt4 book ai didi

c - 有没有办法测试我是否在信号处理程序中?

转载 作者:太空狗 更新时间:2023-10-29 16:09:48 25 4
gpt4 key购买 nike

我必须处理一个可以从大型项目中的不同位置调用的日志记录模块。我遇到的问题是有时可以从信号处理程序内执行的代码调用模块。通常,日志模块包括使用 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);
}

话虽如此,您可以使用一种技术以对许多程序有意义的方式回答这个问题。选择一个您不打算使用的信号,并将其添加到您处理的所有信号的 sa_mask 中,使用 sigaction 安装信号处理程序。然后你可以使用sigprocmask检查当前的信号掩码,如果你指定的信号在信号掩码中,那意味着信号处理程序已经被调用并且还没有返回(返回将恢复原始信号面具)。

关于c - 有没有办法测试我是否在信号处理程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2389919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com