Jump to content

Обработка сигнала C

(Перенаправлено с Signal.h )

В стандартной библиотеке C обработка сигналов определяет, как программа обрабатывает различные сигналы во время своего выполнения. Сигнал может сообщать о каком-то исключительном поведении внутри программы (например, о делении на ноль ) или сигнал может сообщать о каком-то асинхронном событии вне программы (например, о нажатии клавиши интерактивного внимания на клавиатуре).

Стандартные сигналы

[ редактировать ]

Стандарт C определяет только 6 сигналов. Все они определены в signal.h заголовок ( csignal заголовок в C++ ): [ 1 ]

  • SIGABRT – «прерывание», аварийное завершение.
  • SIGFPE исключение с плавающей запятой .
  • SIGILL – «незаконное», недействительное указание.
  • SIGINT – «прерывание», интерактивный запрос внимания, отправленный в программу.
  • SIGSEGV – « нарушение сегментации », неверный доступ к памяти.
  • SIGTERM – «прекратить», запрос на завершение, отправленный в программу.

Дополнительные сигналы могут быть указаны в signal.h заголовок по реализации. Например, Unix и Unix-подобные операционные системы (такие как Linux ) определяют более 15 дополнительных сигналов; см . сигнал Unix . [ 2 ]

  • SIGTRAP в целях отладки. Он зависит от платформы и может использоваться в Unix -подобных операционных системах.

Умение обращаться

[ редактировать ]

Сигнал можно сгенерировать, вызвав raise() или kill() системные вызовы. raise() отправляет сигнал текущему процессу, kill() отправляет сигнал определенному процессу.

Обработчик сигнала — это функция , которая вызывается целевой средой при возникновении соответствующего сигнала. Целевая среда приостанавливает выполнение программы до тех пор, пока обработчик сигнала не вернется или не вызовет longjmp().

Обработчики сигналов могут быть установлены с помощью signal() или sigaction(). Поведение signal() за всю историю менялось несколько раз, и его использование не рекомендуется. [ 3 ] Его можно переносить только тогда, когда он используется для установки расположения сигнала на SIG_DFL или SIG_IGN. Обработчики сигналов могут быть указаны для всех сигналов, кроме двух ( SIGKILL и SIGSTOP не могут быть перехвачены, заблокированы или проигнорированы).

Если сигнал сообщает об ошибке внутри программы (и сигнал не является асинхронным), обработчик сигнала может завершить работу, вызвав abort(), exit(), или longjmp().

Функция Описание
raise искусственно отправляет сигнал вызывающему процессу
kill искусственно отправляет сигнал указанному процессу
signal устанавливает действие, предпринимаемое, когда программа получает определенный сигнал

Пример использования

[ редактировать ]
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

volatile sig_atomic_t status = 0;

static void catch_function(int signo) {
    status = signo;
}

int main(void) {
    // Set above function as signal handler for the SIGINT signal:
    if (signal(SIGINT, catch_function) == SIG_ERR) {
        fputs("An error occurred while setting a signal handler.\n", stderr);
        return EXIT_FAILURE;
    }
    puts("Raising the interactive attention signal.");
    if (raise(SIGINT)) {
        fputs("Error raising the signal.\n", stderr);
        return EXIT_FAILURE;
    }
    if (status == SIGINT) puts("Interactive attention signal caught.");
    puts("Exiting.");
    return EXIT_SUCCESS;
    // exiting after raising signal
}

См. также

[ редактировать ]
  1. ^ Спецификация ISO/IEC 9899:1999 (PDF) . п. 258, § 7.14 Обработка сигналов .
  2. ^ «Базовые спецификации открытой группы, выпуск 6 — signal.h — сигналы» . Проверено 10 января 2012 г.
  3. ^ https://man7.org/linux/man-pages/man2/signal.2.html Страница руководства Signal(2)
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 476622fe8bb18395783380cc2139da5e__1716456720
URL1:https://arc.ask3.ru/arc/aa/47/5e/476622fe8bb18395783380cc2139da5e.html
Заголовок, (Title) документа по адресу, URL1:
C signal handling - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)