Отправка сигналов процессам
Отправка сигнала дочернему процессу — это способ прерывания его деятельности. Существует несколько различных сигналов, каждый со своим значением. Набор сигналов и их имена определяются операционной системой. Например, сигнал SIGINT означает, что пользователь нажал C-c или произошло нечто аналогичное.
Каждый сигнал оказывает стандартное воздействие на дочерний процесс. Большинство сигналов убивают дочерний процесс, но некоторые вместо этого останавливают (или возобновляют) выполнение. Большинство сигналов могут обрабатываться программами; если программа обрабатывает сигнал, то мы ничего не можем сказать о его воздействии.
Вы можете явно отправить сигналы, вызвав функции в этом разделе. Emacs также отправляет сигналы автоматически в определенные моменты: закрытие буфера отправляет сигнал SIGHUP всем связанным процессам; закрытие Emacs отправляет сигнал SIGHUP всем оставшимся процессам. (SIGHUP — это сигнал, который обычно указывает, что пользователь «повесил трубку», т.е. отключился.)
Каждая из функций отправки сигналов принимает два необязательных аргумента: process и current-group.
Аргумент process должен быть либо процессом, именем процесса, буфером, именем буфера, или nil. Буфер или имя буфера представляют процесс через get-buffer-process. nil обозначает процесс, связанный с текущим буфером. За исключением stop-process и continue-process, выдается ошибка, если process не идентифицирует активный процесс или если он представляет собой сетевое, последовательное или конвейерное соединение.
Аргумент current-group — это флаг, который имеет значение, когда вы запускаете оболочку управления заданиями в качестве дочернего процесса Emacs. Если он не nil, то сигнал отправляется текущей группе процессов терминала, который Emacs использует для связи с дочерним процессом. Если процесс — это оболочка управления заданиями, это означает текущую подзадачу оболочки. Если current-group равно nil, сигнал отправляется группе процессов непосредственного дочернего процесса Emacs. Если дочерний процесс — оболочка управления заданиями, это сама оболочка. Если current-group равно lambda, сигнал отправляется группе процессов, владеющей терминалом, но только если это не сама оболочка.
Флаг current-group не имеет эффекта, когда для связи с дочерним процессом используется конвейер, так как операционная система не поддерживает различие в случае конвейеров. По той же причине оболочки управления заданиями не будут работать, когда используется конвейер. См. process-connection-type в Асинхронных процессах.
- Функция: interrupt-process &optional process current-group
Эта функция прерывает процесс process, отправив сигнал
SIGINT. Вне Emacs нажатие символа прерывания (обычно C-c на некоторых системах и DEL на других) отправляет этот сигнал. Когда аргумент current-group не равенnil, можно представить эту функцию как нажатие C-c на терминале, через который Emacs общается с дочерним процессом.
- Функция: kill-process &optional process current-group
Эта функция убивает процесс process, отправив сигнал
SIGKILL. Этот сигнал убивает дочерний процесс немедленно и не может быть обработан дочерним процессом.
- Функция: quit-process &optional process current-group
Эта функция отправляет сигнал
SIGQUITпроцессу process. Этот сигнал отправляется символом выхода (обычно C-\) когда вы не находитесь внутри Emacs.
- Функция: stop-process &optional process current-group
-
Эта функция останавливает указанный process. Если это реальный дочерний процесс, выполняющий программу, он отправляет сигнал
SIGTSTPэтому дочернему процессу. Если process представляет собой сетевое, последовательное или конвейерное соединение, эта функция запрещает обработку входящих данных из соединения; для сетевого сервера это означает отказ от приема новых соединений. Используйтеcontinue-processдля возобновления нормального выполнения.Вне Emacs на системах с управлением заданиями символ остановки (обычно C-z) обычно отправляет сигнал
SIGTSTPдочернему процессу. Когда current-group не равенnil, эту функцию можно представить как нажатие C-z на терминале, используемом Emacs для связи с дочерним процессом.
- Функция: continue-process &optional process current-group
Эта функция возобновляет выполнение процесса process. Если это реальный дочерний процесс, выполняющий программу, он отправляет сигнал
SIGCONTэтому дочернему процессу; это предполагает, что process был остановлен ранее. Если process представляет собой сетевое, последовательное или конвейерное соединение, эта функция возобновляет обработку входящих данных из соединения. Для последовательных соединений данные, которые появились в период остановки процесса, могут быть потеряны.
- Команда: signal-process process signal
-
Эта функция отправляет сигнал процессу process. Аргумент signal определяет, какой сигнал отправить; он должен быть целым числом или символом, имя которого является сигналом.
Аргумент process может быть идентификатором процесса системы ID (целое число); это позволяет отправлять сигналы процессам, которые не являются дочерними процессами Emacs. См. Системные процессы.
Иногда необходимо отправить сигнал удаленному асинхронному процессу. Это возможно, написав собственную реализацию interrupt-process. Затем эту функцию необходимо добавить в interrupt-process-functions.
- Переменная: interrupt-process-functions
-
Эта переменная представляет собой список функций, которые должны вызываться для
interrupt-process. Аргументы функций такие же, как и дляinterrupt-process. Эти функции вызываются в порядке списка, пока одна из них не вернёт не-nil. Функция по умолчанию, которая всегда должна быть последней в этом списке, —internal-default-interrupt-process.Это механизм, с помощью которого Tramp реализует
interrupt-process.
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Signals-to-Processes.html