Spec-Zone.ru › Elisp

Отправка сигналов процессам

Отправка сигнала подпроцессу — это способ прервать его работу. Существует несколько различных сигналов, каждый из которых имеет своё значение. Набор сигналов и их имена определяются операционной системой. Например, сигнал 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API