Большинство программ не обрабатывает сигналы в явном виде, это скорее потому, что высокоуровневые библиотеки сами заботятся об этом. И программисту можно не беспокоится.
Но часто нужно написать консольную утилиту, или демон, которые просто обязаны уметь совладать с обработкой сообщений.
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h>
Будем обрабатывать сигнал завершения программы. Ведь нужно иногда перед завершением сохранить информацию и т.д.
Мы же просто выведем сообщение о завершении.
Обработчик:
void term_handler(int i){ printf ("Terminating\n"); exit(EXIT_SUCCESS); }
Вообще весь механизм очень похож на работу с прерываниями в микроконтроллерах. Обработчик сигнала (как и прерывание) будет выполнен при поступлении сигнала независимо от действий выполняемых программой.
Теперь main функция:
int main(int argc, char ** argv) { struct sigaction sa; sigset_t newset; sigemptyset(&newset); // чистимся sigaddset(&newset, SIGHUP); // добавляем сигнал SIGHUP sigprocmask(SIG_BLOCK, &newset, 0); // блокируем его sa.sa_handler = term_handler; // указываем обработчик sigaction(SIGTERM, &sa, 0); // обрабатываем сигнал SIGTERM printf("My pid is %i\n", getpid()); // выводим PID процесса printf("Waiting...\n"); while(1) sleep(1); // ждём return EXIT_FAILURE; }
В ходе программы мы создаём экземпляр структуры sigaction для назначения обработчика. Мы блокируем сигнал SIGHUP для того, чтобы он не завершил программу раньше чем нам нужно и обрабатываем SIGTERM. После всех настроек мы просто ожидаем.
Вывод программы:
My pid is 4019 Waiting...
Если завершить программу будет выведено сообщение:
Terminating
Удачи в ваших начинаниях.