Какие сигналы нельзя перехватывать в Linux
Обновлено: 21.11.2024
Все эти сигналы используются, чтобы тем или иным образом сообщить процессу о завершении. У них разные имена, потому что они используются для немного разных целей, и программы могут обрабатывать их по-разному.
Причина обработки этих сигналов обычно заключается в том, чтобы ваша программа могла привести себя в порядок перед фактическим завершением. Например, вы можете сохранить информацию о состоянии, удалить временные файлы или восстановить предыдущие режимы терминала. Такой обработчик должен заканчиваться указанием действия по умолчанию для произошедшего сигнала, а затем его повторным вызовом; это приведет к завершению программы с этим сигналом, как если бы у нее не было обработчика. (См. Обработчики, завершающие процесс.)
(Очевидное) действие по умолчанию для всех этих сигналов — завершить процесс.
Макрос: int SIGTERM ¶
Сигнал SIGTERM — это общий сигнал, используемый для завершения программы. В отличие от SIGKILL, этот сигнал можно заблокировать, обработать или проигнорировать. Это обычный способ вежливо попросить программу завершить работу.
Команда оболочки kill генерирует сигнал SIGTERM по умолчанию.
Макрос: int SIGINT ¶
Сигнал SIGINT («программное прерывание») отправляется, когда пользователь вводит символ INTR (обычно C-c ). Информацию о поддержке C-c драйвером терминала см. в разделе Специальные символы.
Макрос: int SIGQUIT ¶
Сигнал SIGQUIT похож на SIGINT , за исключением того, что он управляется другой клавишей — символом QUIT, обычно C-\ — и создает дамп ядра, когда завершает процесс, точно так же, как сигнал ошибки программы. Вы можете думать об этом как об ошибке программы, «обнаруженной» пользователем.
Информацию о дампах ядра см. в разделе Сигналы программных ошибок. Информацию о поддержке драйвера терминала см. в разделе Специальные символы.
Определенные виды очистки лучше не использовать при обработке SIGQUIT . Например, если программа создает временные файлы, она должна обрабатывать другие запросы на завершение, удаляя временные файлы. Но для SIGQUIT лучше их не удалять, чтобы пользователь мог изучить их вместе с дампом ядра.
Макрос: int SIGKILL ¶
Сигнал SIGKILL используется для немедленного завершения программы. С ним нельзя справиться или проигнорировать, и поэтому он всегда смертелен. Также невозможно заблокировать этот сигнал.
Этот сигнал обычно генерируется только явным запросом. Поскольку это невозможно обработать, вы должны генерировать его только в крайнем случае, после того, как сначала попробуете менее радикальный метод, такой как C-c или SIGTERM . Если процесс не отвечает ни на какие другие сигналы завершения, отправка ему сигнала SIGKILL почти всегда приведет к его прекращению.
Фактически, если SIGKILL не может завершить процесс, это само по себе является ошибкой операционной системы, о которой вы должны сообщить.
Система генерирует SIGKILL для самого процесса в некоторых необычных условиях, когда программа не может продолжать работу (даже для запуска обработчика сигнала).
Макрос: int SIGHUP ¶
Сигнал SIGHUP («отбой») используется для сообщения о том, что терминал пользователя отключен, возможно, из-за разрыва сетевого или телефонного соединения. Дополнительные сведения об этом см. в разделе Режимы управления.
Этот сигнал также используется для сообщения о завершении управляющего процесса на терминале заданиям, связанным с этим сеансом; это завершение эффективно отключает все процессы в сеансе от управляющего терминала. Дополнительную информацию см. в разделе Внутреннее устройство завершения.
Обработчики сигналов можно установить с помощью системного вызова signal(). Если обработчик сигнала не установлен для конкретного сигнала, используется обработчик по умолчанию. В противном случае сигнал перехватывается и вызывается обработчик сигнала. Процесс также может указать два поведения по умолчанию без создания обработчика: игнорировать сигнал (SIG_IGN) и использовать обработчик сигнала по умолчанию (SIG_DFL). Есть два сигнала, которые невозможно перехватить и обработать: SIGKILL и SIGSTOP.
Обработка сигнала уязвима из-за условий гонки. Поскольку сигналы являются асинхронными, другой сигнал (даже того же типа) может быть доставлен процессу во время выполнения процедуры обработки сигналов. Вызов sigprocmask() можно использовать для блокировки и разблокировки доставки сигналов.
Сигналы могут привести к прерыванию выполняемого системного вызова, оставляя приложению возможность управлять непрозрачным перезапуском.
Обычные варианты использования завершают работающее приложение, прерывают спящие операции (т. е. чтение с устройства). Асинхронно информируют приложение об исключениях или других непредвиденных ситуациях (т. е. SIGSEGV — нарушение сегментации).
Также обратите внимание, что существует возможность возникновения состояния гонки между потоком и обработчиком сигнала, выполняемым из одного и того же контекста потока.Например, доступ к глобальной переменной может быть оптимизирован компилятором в основном потоке, а обработчик сигнала может не уведомлять об изменении ее значения. В таком случае полезно использовать переменные volatile для всех глобальных переменных, к которым обращаются обработчики сигналов.
Существует 2 типа сигналов: одни отправляются процессу с помощью функции kill(), а другие отправляются внутри процесса с помощью функции pthread_kill().
В случае процесса обработчик сигнала должен выполняться в контексте одного из потоков процесса. POSIX не указывает, какой поток должен обрабатывать сигнал. Случайно выбранный поток справится с этим. Обратите внимание, что конкретный поток может заблокировать обработку сигнала при использовании вызова pthread_sigmask(). В таком случае для его обработки будет выбран другой поток. Вызывающий код не может адресовать сигнал конкретному потоку в другом процессе в POSIX-совместимой системе (в старых ядрах Linux возникают проблемы с соответствием).
В рамках процесса один поток может отправить сигнал другому потоку с помощью функции pthread_kill().
Когда сигнал поступает в приложение, нормальное выполнение кода прерывается. Если процесс выполняет какую-то работу с интенсивным использованием ЦП, то его выполнение останавливается, регистры сбрасываются в стек и выполняется обработчик сигнала. Если процесс ожидает какого-то ресурса или просто выполняет функцию sleep(), вызов sleep возвращает значение -1, а для errno устанавливается значение EINTR.
Если сигнал поступает, когда процесс находится в режиме ядра и делает что-то, интенсивно использующее ЦП, или просто не хочет немедленно возвращаться, сценарий другой: обработчик сигнала не может быть выполнен до того, как процесс вернется в пользовательский режим. В пространстве ядра нет асинхронного выполнения кода. Код режима ядра должен явно проверять маску сигнала, или он может использовать некоторые блокирующие вызовы, которые вернут -1 при поступлении сигнала (например, msleep_interruptible() )
Листинг кода 2.1: performance.c
Описание
Простое приложение было разработано, чтобы узнать, сколько итераций цикла ЦП может выполнить за одну секунду. Он был скомпилирован с помощью: gcc -O2 performance.c -o performance К сожалению, код не работает должным образом.
Что делать
Листинг кода 2.2: driver.c
Листинг кода 2.3: reader.c
Листинг 2.4: Makefile
Описание
Имея драйвер и приложение для чтения из него, исследуйте, как влияет сигнал, когда процесс находится в режиме ядра. ./устройство чтения
Что делать
Примечание. Если операция прерывается в контексте ядра, обычно системная функция возвращает -EINTR вызывающей программе. На уровне GLIBC код возврата изменится на -1, а для errno будет установлено значение EINTR.
Примечание: для загрузки/выгрузки модуля ядра должны использоваться следующие команды: insmod driver.ko , rmmod driver.ko Эти операции должны выполняться под учетной записью root: su -
Примечание. Чтобы создать файл устройства: mknod c device 200 0
Примечание. Чтобы проверить, загружен ли модуль ядра: lsmod
Листинг кода 2.5: multithread.c
Описание
Приведенный выше код предназначен для завершения операции при получении сигнала SIGINT (ctrl-C). Для программы важно обрабатывать только SIGINT. Завершение при выходе последнего дочернего элемента не имеет значения. Он не работает должным образом.
Что делать
-
1) Измените my_signal_handler(), чтобы он отправлял сигналы SIGINT другим потокам внутри процесса. Используйте pthread_kill(). Примечание: добавить в обработчик сигнала только pthread_kill недостаточно, также необходима некоторая защита от сигнального шторма.
-
2) Маска SIGINT для всех потоков, включая основной. Используйте sigwaitinfo() в основном потоке для отслеживания поступления SIGINT. Выделите основной поток только для обработки сигнала SIGINT. Прервать выполнение других потоков другим сигналом (SIGUSR1). Действие по умолчанию для SIGUSR1 необходимо изменить, например, установив обработчик для этого сигнала. Используйте sigwaitinfo(), pthread_kill(), sigemptyset(), sigaddset(), pthread_sigmask()
Рисунок 2.1: Диаграмма последовательности 2) решения
Примечание. В случае проблем с завершением приложения можно использовать [Ctrl-z] для остановки приложения. Затем killall -9 [имя_приложения] завершит выполнение
Листинг кода 2.6: devil.c
Описание
Примечание. Он был скомпилирован с использованием: gcc devil.c -D__USE_GNU -o devil
Примечание. Код предназначен только для Linux/x86.
Что делать
Примечание: команда strace очень полезна для выяснения того, что происходит.
Примечание. Взгляните на заголовочный файл ucontext.h.
Обновлено 3 ноября 2008 г.
Резюме: Инструкция для лаборатории системного программирования, содержащая предметы, связанные с сигналами в Linux.
На платформах, совместимых с POSIX, сигналы от SIGRTMIN до SIGRTMAX отправляются компьютерным программам для определенных пользователем целей. Используются символические имена сигналов, поскольку номера сигналов могут различаться на разных платформах. Этимология. SIG — это общий префикс для имен сигналов.
Что означает сигнал № 15 в Linux?
(сигнал 15) — это запрос программе на завершение. Если в программе есть обработчик сигнала SIGTERM, который фактически не завершает приложение, это уничтожение может не иметь никакого эффекта. Это сигнал по умолчанию, отправляемый kill. СИГКИЛЛ.
Что такое SIGTERM в Linux?
Сигнал SIGTERM — это общий сигнал, используемый для завершения программы. SIGTERM предлагает элегантный способ убить программу. Это вежливый способ убить приложение или программу. По умолчанию команда kill отправляет сигнал SIGTERM процессу.
Что вызывает Sigchld?
Условиями, которые приводят к отправке сигнала, являются, например, неправильное выравнивание доступа к памяти или несуществующий физический адрес. Сигнал SIGCHLD отправляется процессу, когда дочерний процесс завершается, прерывается или возобновляется после прерывания.
Какие сигналы нельзя поймать?
Есть два сигнала, которые невозможно перехватить и обработать: SIGKILL и SIGSTOP.
Что происходит после обработчика сигнала?
С помощью fork создается новый процесс. Родительский процесс возвращается к основной функции и ждет нового ввода от пользователя. Дочерний процесс выполняется в фоновом режиме. Дочерний процесс завершается, и запускается сигнал SIGCHLD.
Можно ли перехватить сигнал SIGSTOP?
SIGSTOP и SIGKILL — это два сигнала, которые не могут быть перехвачены и обработаны процессом. SIGTSTP похож на SIGSTOP, за исключением того, что его можно перехватить и обработать.
В чем разница между Sigterm и SIGKILL?
Сигнал SIGTERM — это общий сигнал, используемый для завершения программы. В отличие от SIGKILL, этот сигнал можно заблокировать, обработать или проигнорировать. Это нормальный способ вежливо попросить программу завершить работу. Команда оболочки kill генерирует сигнал SIGTERM по умолчанию.
Кто отправляет SIGTERM?
SIGTERM — это сигнал, который обычно используется для административного завершения процесса. Это не сигнал, который отправит ядро, но это сигнал, который процесс обычно отправляет, чтобы завершить (мягко) другой процесс. Это сигнал, который по умолчанию отправляется kill , pkill , killall …
Можно ли перехватить SIGTERM?
По умолчанию команда kill или pkill отправляет сигнал SIGTERM. Сигналы SIGKILL или SIGSTOP нельзя перехватывать или игнорировать. Вы можете поймать сигнал в Linux, используя sigaction. Используйте в обработчике сигналов только функции, безопасные для асинхронных сигналов.
Что такое SIGCHLD в Linux?
На платформах, совместимых с POSIX, SIGCHLD — это сигнал, отправляемый компьютерными программами при завершении дочернего процесса. Символическая константа для SIGCHLD определена в заголовочном файле signal.h. Используются символические имена сигналов, поскольку номера сигналов могут различаться на разных платформах.
Игнорируется ли сигнал SIGCHLD или перехватывается?
Когда дочерний процесс останавливается или завершается, родительскому процессу отправляется сигнал SIGCHLD. Реакция по умолчанию на сигнал — игнорировать его. Сигнал можно перехватить и получить статус выхода из дочернего процесса, немедленно вызвав wait(2) и wait3(3C).
Что означает sigrtmin + 24 в системном журнале?
Есть ли в Linux сигналы реального времени?
Каково поведение SIGBUS по умолчанию в Linux?
Есть два сигнала, которые невозможно перехватить и обработать: SIGKILL и SIGSTOP.
Можно ли поймать Sigterm?
По умолчанию команда kill или pkill отправляет сигнал SIGTERM. Сигналы SIGKILL или SIGSTOP нельзя перехватывать или игнорировать. Вы можете поймать сигнал в Linux, используя sigaction. Используйте в обработчике сигналов только функции, безопасные для асинхронных сигналов.
Как отправить сигнал Sighup процессу?
<р>3. Отправить сигнал процессу с клавиатуры- SIGINT (Ctrl + C) — вы это уже знаете. Нажатие Ctrl + C убивает запущенный процесс переднего плана. Это отправляет SIGINT процессу, чтобы убить его.
- Вы можете отправить сигнал SIGQUIT процессу, нажав Ctrl + \ или Ctrl + Y.
Какой сигнал может убить процесс без каких-либо условий?
Можно ли игнорировать Sigterm?
Сигнал SIGTERM — это общий сигнал, используемый для завершения программы. В отличие от SIGKILL, этот сигнал можно заблокировать, обработать и игнорировать.
Может ли процесс игнорировать сигнал уничтожения?
Как (на самом деле) убить процесс. Если процесс не отвечает на сигнал TERM, можно использовать сигнал KILL. Процессы UNIX не могут игнорировать сигнал KILL, и процесс немедленно уничтожается. Обратите внимание, что это не позволяет процессу выполнять какую-либо очистку при завершении работы.
Как Python обрабатывает сигналы уничтожения?
Сигналы с 1 по 15 примерно стандартизированы и имеют следующее значение в большинстве систем Linux:
- 1 (SIGHUP): завершить соединение или перезагрузить конфигурацию демонов.
- 2 (SIGINT): прерывание сеанса с диалоговой станции.
- 3 (SIGQUIT): завершение сеанса с диалоговой станции.
Контролирует ли c Send Sigterm?
Обычно -C означает SIGINT, но вы можете изменить его на любой другой символ с помощью команды stty. SIGTERM не связан с символом прерывания, а является просто сигналом, отправляемым по умолчанию командой kill.
Что делает Ctrl Z в Linux?
Последовательность Ctrl-Z приостанавливает текущий процесс. Вы можете вернуть его к жизни с помощью команды fg (передний план) или запустить приостановленный процесс в фоновом режиме с помощью команды bg.
Что делает Ctrl d в терминале?
Ctrl D сообщает терминалу, что он должен зарегистрировать EOF для стандартного ввода, который bash интерпретирует как желание выйти.
Какой номер сигнала Ctrl C?
Что делает Ctrl Y?
Control-Y — это обычная компьютерная команда. Он генерируется, удерживая Ctrl и нажимая клавишу Y на большинстве компьютерных клавиатур. В большинстве приложений Windows это сочетание клавиш работает как повтор, отменяя предыдущую отмену.
Что делает Ctrl Shift F4?
F4: повторить последнее действие. Shift+F4: Повторить последнее действие «Найти». Это удобно, потому что вы можете использовать его для просмотра результатов поиска, не открывая окно «Найти и заменить» или панель навигации. Ctrl+F4: закрыть текущий документ.
Что означает Ctrl H?
Обновлено: 31 декабря 2020 г., предоставлено Computer Hope. Альтернативно называемая Control+H и C-h, Ctrl+H — это сочетание клавиш, функция которого зависит от программы. Например, в текстовых редакторах Ctrl+H используется для поиска и замены символа, слова или фразы.
Читайте также: