Отправка сигналов процессам
Отправка сигнала подпроцессу — это способ прервать его работу. Существует несколько различных сигналов, каждый из которых имеет своё значение. Набор сигналов и их имена определяются операционной системой. Например, сигнал 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
Эта функция отправляет процессу process сигнал
SIGQUIT. Это сигнал, который отправляется при нажатии клавиши выхода (обычно 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 &optional remote
-
Эта функция отправляет сигнал процессу process. Аргумент signal задаёт, какой сигнал отправить; это должно быть целое число или символ, имя которого является именем сигнала.
Аргумент process может быть системным ID процесса (целым числом); это позволяет отправлять сигналы процессам, которые не являются дочерними процессами Emacs. См. раздел Доступ к другим процессам.
Если объект-процесс process содержит свойство
remote-pidили если process является числом, а remote — именем удалённого файла, process интерпретируется как процесс на соответствующем удалённом узле, которому будет отправлен сигнал.Если process — строка, она интерпретируется как объект-процесс с соответствующим именем процесса или как число.
Иногда необходимо отправить сигнал нелокальному асинхронному процессу. Это можно сделать, написав собственную реализацию interrupt-process или signal-process. Затем эту функцию необходимо добавить в interrupt-process-functions или signal-process-functions соответственно.
- Переменная: interrupt-process-functions
-
Эта переменная содержит список функций, вызываемых для
interrupt-process. Аргументы функций совпадают с аргументамиinterrupt-process. Эти функции вызываются в порядке, указанном в списке, пока одна из них не вернёт значение, не равноеnil. Функция по умолчанию, которая всегда должна быть последней в этом списке, —internal-default-interrupt-process.Именно этот механизм используется в Tramp для реализации
interrupt-process.
- Переменная: signal-process-functions
-
Эта переменная содержит список функций, вызываемых для
signal-process. Аргументы функций совпадают с аргументамиsignal-process. Эти функции вызываются в порядке, указанном в списке, пока одна из них не вернёт значение, не равноеnil. Функция по умолчанию, которая всегда должна быть последней в этом списке, —internal-default-signal-process.Именно этот механизм используется в Tramp для реализации
signal-process.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Signals-to-Processes.html