#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. Также обратите внимание, что ваша программа может получить сигнал до того, как у нее появится возможность установить свой обработчик сигналов. Фактически вы участвуете в гонке за сигнализатором. Вот почему вы должны убедиться, что ваши обработчики сигналов установлены, прежде чем делать что-либо еще.