Прием вывода из процессов
Вывод из асинхронных дочерних процессов обычно поступает только тогда, когда Emacs ожидает какого-либо внешнего события, такого как истечение времени или ввод с терминала. Иногда в программе Lisp полезно явно разрешить получение вывода в определенный момент или даже дождаться вывода от процесса.
- Функция: accept-process-output &optional process seconds millisec just-this-one
-
Эта функция позволяет Emacs читать ожидаемый вывод из процессов. Вывод передаётся их функциям фильтрации. Если process не
nil, эта функция не возвращается, пока не будет получен вывод от process или process не закроет соединение.Аргументы seconds и millisec позволяют указать временные интервалы ожидания. Первый указывает интервал, измеряемый в секундах, а второй — в миллисекундах. Два указанных временных интервала складываются, и
accept-process-outputвозвращается по истечении этого времени, даже если нет вывода от дочернего процесса.Аргумент millisec устарел (и его не следует использовать), потому что seconds может быть с плавающей точкой, чтобы указать ожидание дробной части секунды. Если seconds равно 0, функция принимает любой ожидаемый вывод, но не ожидает.
Если process — это процесс, и аргумент just-this-one не
nil, обрабатывается только вывод этого процесса, вывод других процессов приостанавливается до тех пор, пока не будет получен вывод от этого процесса или не истечёт время ожидания. Если just-this-one — целое число, также запрещается выполнение таймеров. Эта функция, как правило, не рекомендуется, но может быть необходима для конкретных приложений, таких как синтез речи.Функция
accept-process-outputвозвращает не-nil, если она получила вывод от process или от любого процесса, если process —nil; это может произойти даже после завершения процесса, если соответствующее соединение содержит буферизованные данные. Функция возвращаетnil, если истекло время ожидания или соединение было закрыто до получения вывода.
Если соединение от процесса содержит буферизованные данные, accept-process-output может вернуть не-nil даже после завершения процесса. Поэтому, хотя следующий цикл:
;; This loop contains a bug. (while (process-live-p process) (accept-process-output process))
часто читает весь вывод от process, он содержит гонку и может пропустить часть вывода, если process-live-p возвращает nil, пока соединение всё ещё содержит данные. Лучше написать цикл так:
(while (accept-process-output process))
Если вы передали не-nil stderr функции make-process, у него будет процесс стандартной ошибки. См. Асинхронные процессы. В этом случае ожидание вывода процесса от основного процесса не ожидает вывода от процесса стандартной ошибки. Чтобы убедиться, что вы получили весь стандартный вывод и всю стандартную ошибку от процесса, используйте следующий код:
(while (accept-process-output process)) (while (accept-process-output stderr-process))
Если вы передали буфер в аргумент stderr функции make-process, вам всё равно нужно дождаться процесса стандартной ошибки, как показано ниже:
(let* ((stdout (generate-new-buffer "stdout"))
(stderr (generate-new-buffer "stderr"))
(process (make-process :name "test"
:command '("my-program")
:buffer stdout
:stderr stderr))
(stderr-process (get-buffer-process stderr)))
(unless (and process stderr-process)
(error "Process unexpectedly nil"))
(while (accept-process-output process))
(while (accept-process-output stderr-process)))
Только когда обе accept-process-output формы возвращают nil, вы можете быть уверены, что процесс завершился и Emacs прочитал весь его вывод.
Чтение ожидаемой стандартной ошибки от процесса, выполняемого на удалённом хосте, таким способом невозможно.
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/Accepting-Output.html