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

Эта функция отправляет сигнал 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

Spec-Zone.ru

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