Вывод, который асинхронный подпроцесс записывает в свой стандартный выходной поток, передается функции, называемой функция фильтрации. По умолчанию функция фильтрации просто вставляет вывод в буфер, который называется ассоциированным буфером процесса (см. Буферы процессов). Если у процесса нет буфера, то функция фильтрации по умолчанию отбрасывает вывод.
Если подпроцесс записывает в свой стандартный поток ошибок, по умолчанию
вывод об ошибках также передается в функцию фильтрации процесса.
В качестве альтернативы вы можете использовать параметр :stderr
с ненулевым значением в вызове make-process
(см. make-process), чтобы
отделить место назначения вывода об ошибках от стандартного вывода.
Когда подпроцесс завершается, Emacs считывает любой ожидающий вывод, а затем прекращает считывание вывода из этого подпроцесса. Следовательно, если у подпроцесса есть дочерние процессы, которые все еще активны и продолжают генерировать вывод, Emacs не получит этот вывод.
Вывод из подпроцесса может поступать только в то время, когда Emacs ожидает:
при чтении ввода из терминала (см. функцию waiting-for-user-input-p),
в sit-for и sleep-for (см. Ожидание истечения времени или ввода),
в accept-process-output (см. Прием вывода из процессов),
и в функциях, которые отправляют данные процессам (см. Отправка ввода процессам).
Это минимизирует проблему ошибок времени, которые обычно преследуют
параллельное программирование. Например, вы можете безопасно создать процесс,
а затем указать его буфер или функцию фильтрации; ни один вывод не может
поступить до того, как вы закончите, если код между ними не вызывает
примитив, который ожидает.
В некоторых системах, когда Emacs считывает вывод из подпроцесса,
данные вывода считываются очень маленькими блоками, что потенциально может
привести к очень низкой производительности. Это поведение может быть в некоторой
степени устранено путем установки переменной process-adaptive-read-buffering
в ненулевое значение (по умолчанию), поскольку она автоматически задержит
чтение из таких процессов, позволяя им генерировать больше вывода, прежде чем
Emacs попытается его прочитать.