Spec-Zone.ru › Elisp

Получение вывода из процессов

Вывод, который асинхронный дочерний процесс записывает в свой поток стандартного вывода, передаётся функции, называемой функцией фильтра. Функция фильтра по умолчанию просто вставляет вывод в буфер, который называется связанным буфером процесса (см. Буферы процессов). Если процесс не имеет буфера, то функция фильтра по умолчанию отбрасывает вывод.

Если дочерний процесс записывает в свой поток стандартной ошибки, то вывод ошибки по умолчанию также передаётся функции фильтра процесса. Если 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

Spec-Zone.ru

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