Освоение обработчиков сигналов в C: подробное руководство

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

  1. Основы: регистрация обработчика сигналов
    Чтобы обрабатывать сигналы, вам необходимо зарегистрировать функцию обработчика сигналов с помощью функции signal(). Вот пример, который перехватывает сигнал SIGINT (отправляется, когда пользователь нажимает Ctrl+C):
#include <stdio.h>
#include <signal.h>
void sigint_handler(int signal) {
    printf("Caught SIGINT signal. Exiting gracefully...\n");
    // Additional cleanup code goes here
    exit(0);
}
int main() {
    signal(SIGINT, sigint_handler);
    // Your program logic goes here
    return 0;
}
  1. Игнорирование сигналов
    Иногда вам может потребоваться игнорировать определенные сигналы. Этого можно добиться, присвоив обработчику сигнала константу SIG_IGN:
#include <stdio.h>
#include <signal.h>
int main() {
    signal(SIGINT, SIG_IGN);
    // Your program logic goes here
    return 0;
}
  1. Обработка пользовательских сигналов
    Помимо стандартных сигналов, таких как SIGINT, вы также можете определять и обрабатывать свои собственные сигналы с помощью sigaction(). Вот пример:
#include <stdio.h>
#include <signal.h>
void custom_signal_handler(int signal) {
    printf("Caught custom signal.\n");
    // Custom signal handling logic goes here
}
int main() {
    struct sigaction sa;
    sa.sa_handler = custom_signal_handler;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGUSR1, &sa, NULL);
    // Your program logic goes here
    return 0;
}
  1. Сброс обработчиков сигналов
    В некоторых случаях вам может потребоваться восстановить поведение обработчика сигналов по умолчанию. Этого можно добиться, используя константу SIG_DFL:
#include <stdio.h>
#include <signal.h>
void custom_signal_handler(int signal) {
    printf("Caught custom signal.\n");
    // Custom signal handling logic goes here
    signal(SIGUSR1, SIG_DFL); // Reset the handler
}
int main() {
    signal(SIGUSR1, custom_signal_handler);
    // Your program logic goes here
    return 0;
}

Обработчики сигналов — это мощный механизм обработки асинхронных событий и ошибок в программах на языке C. Ознакомившись с методами, описанными в этой статье, вы будете хорошо подготовлены к эффективной обработке сигналов. Не забудьте учесть конкретные требования вашего приложения и выбрать подходящий подход к обработке сигналов.