Получение вывода процессов
Вывод, который асинхронный подпроцесс записывает в стандартный поток вывода, передается функции, называемой функцией фильтра. Функция фильтра по умолчанию просто вставляет вывод в буфер, называемый буфером процесса (см. Буферы процессов). Если у процесса нет буфера, фильтр по умолчанию отбрасывает вывод.
Если подпроцесс записывает данные в стандартный поток ошибок, по умолчанию вывод ошибок также передается функции фильтра процесса. В качестве альтернативы можно использовать параметр :stderr со значением, отличным от nil, при вызове make-process (см. make-process), чтобы направить вывод ошибок отдельно от стандартного вывода.
Когда подпроцесс завершается, 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 попытается их считать. По умолчанию используется значениеnil, так как значение, отличное отnil, снижает производительность.
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/Output-from-Processes.html