【问题标题】:Keyboard signal handling, adding parameters to callback handler function (Ubuntu, intel)键盘信号处理,向回调处理函数添加参数(Ubuntu,intel)
【发布时间】:2010-10-29 16:20:13
【问题描述】:

我有这个代码:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

// Define the function to be called when ctrl-c (SIGINT) signal is sent to process
void
signal_callback_handler(int signum)
{
   printf("Caught signal %d\n",signum);
   // Cleanup and close up stuff here

   // Terminate program
   exit(signum);
}

int main()
{
   // Register signal and signal handler
   signal(SIGINT, signal_callback_handler);

   while(1)
   {
      printf("Program processing stuff here.\n");
      sleep(1);
   }
   return EXIT_SUCCESS;
}

有没有办法在回调函数中传递一个额外的参数? 比如:

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

// Define the function to be called when ctrl-c (SIGINT) signal is sent to process
void
signal_callback_handler(int signum, int k)
{

   k++; // Changing value of k
}

int main()
{
   int k = 0;
   // Register signal and signal handler
   signal(SIGINT, signal_callback_handler(k);

   while(1)
   {
      printf("Program processing stuff here.\n");
      printf(" blah %d\n", k);
      sleep(1);
   }
   return EXIT_SUCCESS;
}

谢谢

【问题讨论】:

    标签: c keyboard signals signal-handling


    【解决方案1】:

    不,没有,而且您实际上应该在信号处理程序中的事情很少。

    我通常只是设置一个标志并返回,然后让真正的代码处理它。

    如果您真的想这样做,您可以将 k 设为文件级静态,以便 main 和信号处理程序(以及文件中的所有其他函数)都可以访问它,但您可能想要调查该选项的安全性(信号处理程序是否可以在实际程序使用或更新值时运行)。

    换句话说,类似于:

    static int k = 0;
    
    void signal_callback_handler(int signum) {
       k++; // Changing value of k
    }
    
    int main() {
       // Register signal and signal handler
       signal(SIGINT, signal_callback_handler);
       : :
    

    【讨论】:

    • 使用通用变量?能说的具体点吗?
    • 即使这样,共享变量也应该是 sig_atomic_t 类型,或者您应该根据需要小心地阻止关键部分周围的信号(相对于程序和信号处理程序之间共享数据的突变) .请参阅 GNU C 库文档中的 "Signal Handling"
    • 另请注意,您的程序有可能在有机会安装其信号处理程序之前收到信号。您实际上是在与信号器比赛。这就是为什么你应该在做任何其他事情之前确保你的信号处理程序就位。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2011-10-21
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多