Получение вывода из процессов
Вывод, который асинхронный дочерний процесс записывает в свой поток стандартного вывода, передаётся функции, называемой функцией фильтра. Функция фильтра по умолчанию просто вставляет вывод в буфер, который называется связанным буфером процесса (см. Буферы процессов). Если процесс не имеет буфера, то функция фильтра по умолчанию отбрасывает вывод.
Если дочерний процесс записывает в свой поток стандартной ошибки, то вывод ошибки по умолчанию также передаётся функции фильтра процесса. Если Emacs использует псевдо-терминал (pty) для связи с дочерним процессом, то невозможно разделить потоки стандартного вывода и стандартной ошибки дочернего процесса, так как у псевдо-терминала есть только один канал вывода. В этом случае, если вы хотите сохранить разделение вывода этих потоков, вы должны перенаправить один из них в файл — например, используя соответствующую команду оболочки через start-process-shell-command или аналогичную функцию.
В качестве альтернативы можно использовать параметр :stderr со значением, отличным от nil, в вызове make-process (см. make-process), чтобы сделать место назначения вывода ошибки отдельным от стандартного вывода; в этом случае Emacs будет использовать каналы для связи с дочерним процессом.
Когда дочерний процесс завершается, Emacs считывает любой ожидающий вывод, затем прекращает чтение вывода от этого дочернего процесса. Поэтому, если у дочернего процесса есть дочерние процессы, которые всё ещё активны и всё ещё производят вывод, Emacs не получит этот вывод.
Вывод дочернего процесса может поступать только в то время, когда Emacs ожидает: при чтении ввода с терминала (см. функцию waiting-for-user-input-p), в sit-for и sleep-for (см. Ожидание), в accept-process-output (см. Приём вывода) и в функциях, которые отправляют данные в процессы (см. Ввод в процессы). Это минимизирует проблему временных ошибок, обычно преследующих параллельное программирование. Например, вы можете безопасно создать процесс и только затем указать его буфер или функцию фильтра; никакой вывод не может поступить до тех пор, пока вы не закончите, если код между ними не вызывает ни одну из примитивных функций ожидания.
- Переменная: process-adaptive-read-buffering
На некоторых системах, когда Emacs читает вывод дочернего процесса, данные вывода считываются очень маленькими блоками, что потенциально приводит к очень низкой производительности. Это поведение можно частично исправить, установив переменную
process-adaptive-read-bufferingна значение, отличное от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/Output-from-Processes.html