Обработка сигналов клавиатуры, добавление параметров в функцию обработчика обратного вызова (Ubuntu, Intel) - PullRequest
0 голосов
/ 29 октября 2010

У меня есть этот код:

#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;
}

Спасибо

1 Ответ

2 голосов
/ 29 октября 2010

Нет, нет, и очень мало того, что вы на самом деле должны делать в обработчике сигналов в любом случае.

Обычно я просто устанавливаю флаг и возвращаюсь, позволяя реальному коду обрабатыватьс этого момента.

Если вы действительно хотите это сделать, вы можете сделать 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);
   : :
...