在 C++中访问信号处理程序内的main()函数的变量

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

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

下面是一个示例代码。

#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 连接等),一旦发送信号,程序必须刷新。

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

0

您可以将其声明为全局变量,然后您将能够从函数内部更改其值,因为没有其他方法可以从信号处理函数访问变量(除了由信号函数定义的变量)由于其独特的原型。

0

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

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);

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(309)
斯坦福核心 NLP频率计数
上一篇
斯坦福核心 NLP频率计数
下一篇

相关推荐

  • vc++6.0怎么新建c语言文件/* 标题 */#include int main(void){ printf(Hello

    首先打开VC++6.0,点击菜单栏的“文件”,在下拉菜单中选择“新建”;在新建对话框中,选择“文件”,然后在右侧的列表中选择“C/C++源文件”;…

    2023-01-02 09:05:00
    0 95 20
  • Charleskeith女包:R包:方法和包:基本冲突(invalid input please try again in r)

    关于Charleskeith女包的问题,在invalid input please try again in r中经常遇到,我正在尝试学习 R 编程基础。但是我在尝试使用已经安装的软件包 'nycflights13' 时遇到了一个问题。当我运行库(航班)时,它会给出错误。…

    2022-12-10 14:39:25
    0 38 69
  • 服务器常见故障处理:在wcf中管理服务器故障转移(n+1 failover)

    关于服务器常见故障处理的问题,在n+1 failover中经常遇到,我正在创建一个简单的应用程序,客户端通过 WCF 在服务器上调用服务。我还想创建一个备份服务器,当主服务器出现故障时,可以将其中一个客户端指定为新的主服务器。实现此功能的最佳方法是什么?…

    2022-12-20 02:33:26
    0 91 65
  • 经口吸痰的深度是多少cm:深度优先搜索-场景图-我当前的深度是多少

    关于经口吸痰的深度是多少cm的问题,在searchscene中经常遇到,-大家好,我正在尝试为场景图实现“深度优先搜索”。这是我到目前为止所拥有的-但是我一直在想如何跟踪当前元素在图中的深度。可以说我可以将 order.size()计数为第一个分支的深度-但是当代码再次跳起来并进入下一个分支时,如何弹出元素?任何提示都将不胜感激。…

    2022-12-15 06:09:27
    0 81 55
  • 饥荒指令代码大全:MIPS指令和机器代码(mips machine code)

    关于饥荒指令代码大全的问题,在mips machine code中经常遇到,寄存器$t0包含值0x10008040。写出 MIPS 指令的机器代码,该指令从主存储器的地址0x10008048加载一个字,并将结果存储在寄存器$s1中。该指令应使用寄存器$t0。答案为机器代码的十六进制值。…

    2022-12-17 07:55:19
    0 56 92
  • C语言cin的用法:cin.fail()在C++中的含义

    关于C语言cin的用法的问题,在googlecin中经常遇到,关于cin.fail()在C++中的含义的编程代码示例如下。…

    2022-11-28 01:44:40
    0 52 19
  • G96编程实例:Unity runUIApplicationMainWithArgc:argv:] +96(main.mm:96

    关于G96编程实例的问题,在crash 96中经常遇到,我在 Crashlytics 上遇到了下面的崩溃错误。我找不到任何解决方案,我不明白原因。95 % 发生在 iPad 上。…

    2022-11-28 01:19:46
    0 36 64
  • Plaid-error_code:'ITEM_LOGIN_REQUIRED'。每小时左右重复一次

    在开发环境中调用 / accounts / balances / get 端点时,我正在得到以下响应。得到这个之后,我将使用更新模式来获取新的 access_token。一旦我交换了新的令牌,一切工作正常大约一个小时,然后这个错误就会再次发生。我 100% 不在银行端进行任何更新。…

    2022-12-20 11:03:44
    0 57 20

发表评论

登录 后才能评论

评论列表(53条)