Сторожевые функции: определение изменений состояния процесса
Сторожевая функция процесса — это функция, которая вызывается всякий раз, когда связанный процесс изменяет состояние по любой причине, включая сигналы (отправленные Emacs или вызванные собственными действиями процесса), которые завершают, останавливают или продолжают процесс. Сторожевая функция процесса также вызывается, если процесс завершается. Сторожевая функция получает два аргумента: процесс, для которого произошло событие, и строку, описывающую тип события.
Если для процесса не была указана сторожевая функция, будет использована сторожевая функция по умолчанию, которая вставляет сообщение в буфер процесса с именем процесса и строкой, описывающей событие.
Строка, описывающая событие, выглядит следующим образом (это не исчерпывающий список строк событий):
-
"finished\n". -
"deleted\n". -
"exited abnormally with code exitcode (core dumped)\n". Часть «core dumped» необязательна и появляется только в том случае, если процесс сбросил ядро. -
"failed with code fail-code\n". -
"signal-description (core dumped)\n". signal-description — это зависящее от системы текстовое описание сигнала, например,"killed"дляSIGKILL. Часть «core dumped» необязательна и появляется только в том случае, если процесс сбросил ядро. -
"open from host-name\n". -
"open\n". -
"run\n". -
"connection broken by remote peer\n".
Сторожевая функция выполняется только тогда, когда Emacs ожидает (например, ввода с терминала, истечения времени или получения вывода процесса). Это предотвращает ошибки временной синхронизации, которые могут возникнуть при запуске сторожевых функций в произвольных местах в середине других программ Lisp. Программа может ожидать, чтобы сторожевые функции работали, вызывая sit-for или sleep-for (см. Ожидание) или accept-process-output (см. Приём вывода). Emacs также позволяет сторожевым функциям выполняться, когда цикл команд считывает ввод. delete-process вызывает сторожевую функцию при завершении выполняемого процесса.
Emacs не сохраняет очередь из нескольких причин для вызова сторожевой функции одного процесса; он сохраняет только текущее состояние и факт изменения. Поэтому два изменения состояния, следующих друг за другом с небольшой задержкой, могут вызвать сторожевую функцию только один раз. Однако завершение процесса всегда вызовет сторожевую функцию ровно один раз. Это связано с тем, что состояние процесса не может измениться снова после завершения.
Emacs явно проверяет вывод процесса перед запуском сторожевой функции процесса. После того как сторожевая функция выполняется из-за завершения процесса, дальнейший вывод от процесса получить нельзя.
Сторожевая функция, которая записывает вывод в буфер процесса, должна проверить, жив ли буфер. Если она пытается вставить данные в мертвый буфер, произойдёт ошибка. Если буфер мёртв, (buffer-name (process-buffer process)) возвращает nil.
Выход обычно запрещён внутри сторожевой функции — в противном случае действие нажатия клавиш C-g на уровне команд или для выхода из пользовательской команды было бы непредсказуемым. Если вы хотите разрешить выход внутри сторожевой функции, привяжите inhibit-quit к nil. В большинстве случаев правильный способ сделать это — с помощью макроса with-local-quit. См. Выход.
Если во время выполнения сторожевой функции происходит ошибка, она автоматически перехватывается, чтобы не остановить выполнение программ, которые работали при запуске сторожевой функции. Однако, если debug-on-error не nil, ошибки не перехватываются. Это позволяет использовать отладчик Lisp для отладки сторожевой функции. См. Отладчик.
Во время выполнения сторожевой функции сторожевая функция процесса временно устанавливается в nil, чтобы сторожевая функция не выполнялась рекурсивно. По этой причине сторожевой функции нельзя указать новую сторожевую функцию.
Обратите внимание, что Emacs автоматически сохраняет и восстанавливает данные соответствия во время выполнения сторожевых функций. См. Данные соответствия.
- Функция: set-process-sentinel process sentinel
-
Эта функция связывает sentinel с process. Если sentinel — это
nil, процесс будет иметь сторожевую функцию по умолчанию, которая вставляет сообщение в буфер процесса, когда статус процесса меняется.Изменения сторожевых функций процесса вступают в силу немедленно — если сторожевая функция должна быть запущена, но ещё не была вызвана, и вы задаёте новую сторожевую функцию, то при последующем вызове сторожевой функции будет использоваться новая.
(defun msg-me (process event) (princ (format "Process: %s had the event '%s'" process event))) (set-process-sentinel (get-process "shell") 'msg-me) ⇒ msg-me(kill-process (get-process "shell")) -| Process: #<process shell> had the event 'killed' ⇒ #<process shell>
- Функция: process-sentinel process
Эта функция возвращает сторожевую функцию process.
В случае необходимости передачи изменений состояния процесса нескольким сторожевым функциям, вы можете использовать add-function для объединения существующей сторожевой функции с новой. См. Функции консультирования.
- Функция: waiting-for-user-input-p
В то время как сторожевая или фильтрующая функция выполняется, эта функция возвращает значение, отличное от
nil, если Emacs ожидал ввода с клавиатуры от пользователя в момент вызова сторожевой или фильтрующей функции, илиnil, если он этого не делал.
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/Sentinels.html