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

#c #keyboard #signals #signal-handling

#c #клавиатура #сигналы #обработка сигналов

Вопрос:

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

 #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 %dn",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 %dn", k);
      sleep(1);
   }
   return EXIT_SUCCESS;
}
  

Спасибо

Ответ №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);
   : :
  

Комментарии:

1. используете общую переменную? Не могли бы вы быть более конкретными, пожалуйста?

2. Даже в этом случае общая переменная должна либо иметь тип sig_atomic_t , либо вам следует тщательно блокировать сигналы вокруг критических разделов (относительно изменения данных, совместно используемых программой и обработчиком сигналов) в зависимости от обстоятельств. Смотрите «Обработка сигналов» в документации библиотеки GNU C.

3. Также обратите внимание, что ваша программа может получить сигнал до того, как у нее появится возможность установить свой обработчик сигналов. Фактически вы участвуете в гонке за сигнализатором. Вот почему вы должны убедиться, что ваши обработчики сигналов установлены, прежде чем делать что-либо еще.