【问题标题】:Accessing variables of main() function inside signal handler in C++在 C++ 中的信号处理程序中访问 main() 函数的变量
【发布时间】:2022-05-01 09:18:10
【问题描述】:

当用户定义的信号发送到进程时,我想使用信号处理程序更改主函数中声明的变量。我不想使用任何全局变量。

以下是示例代码。

#include <iostream>
#include <csignal>

void signal_handler(int sig) {
    // I want to change value of b here
}

int main() {
    signal(SIGUSR1, signal_handler);
    int a, b = 10;
    while(1) {
        std::cin >> a;
        std::cout << a * b << std::endl;
    }
}

代替“b”,它可以是任何其他类型的变量(套接字文件描述符、mysql 连接等),一旦发送信号,程序必须刷新这些变量。对所有这些任务都使用全局变量并不好。

所以,请建议实现它的不同方法。 谢谢。

【问题讨论】:

  • 请注意,您不能在信号处理程序中做很多事情。搜索async signal safe
  • 引用传递
  • 您只需要一个由信号处理程序设置的全局bool signal_happened。然后,您的 while 循环将定期检查并在需要时执行所需的任何操作。

标签: c++ c++11 signal-handling


【解决方案1】:

您可以将其声明为全局变量,然后您将能够从函数内部更改其值,因为没有其他方法可以从信号处理函数访问变量(除了由信号函数定义的变量)由于其独特的原型。 我发现这个答案可以澄清您在处理信号时对使用全局变量的疑虑 -> Providing/passing argument to signal handler 。 我希望这会有所帮助!

【讨论】:

  • 该问题明确表示OP不想使用全局变量。
  • @RufusVS 谢谢,我编辑了答案以使其更清楚!
【解决方案2】:

如果它让您感觉更好,您可以使用专门设计用于处理信号的类型的私有静态成员,而不是使用全局变量:

class SigHnd {
  private:
    static int b;
  public:
    static void signal_handler(int) {
      b = 20; 
    }   
    static int get_b() {
      return b;
    }   
};
int SigHnd::b = 10; 

您可以在循环中访问b 的值:

std::cout << a * SigHnd::get_b() << std::endl;

但是除了信号处理程序之外没有人可以改变它。您可以将它放在您喜欢的任何命名空间中,以避免它弄乱根命名空间。

您注册它就像注册免费函数处理程序一样:

signal(SIGUSR1, SigHnd::signal_handler);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多