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

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

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