41.9 接收进程输出

异步子进程写入其标准输出流的内容,会传递给一个名为 过滤器函数(filter function) 的函数。默认的过滤器函数仅会将输出插入到一个缓冲区中,该缓冲区称为该进程的关联缓冲区(see 进程缓冲区)。如果进程没有关联缓冲区,则默认过滤器会丢弃输出。

若子进程向其标准错误流写入内容,默认情况下错误输出也会传递给进程过滤器函数。你也可以在调用 make-process 时使用非 nil:stderr 参数(see make-process),让错误输出的目标与标准输出分开。

子进程终止时,Emacs 会读取所有待处理的输出,之后停止从该子进程读取内容。因此,如果该子进程存在仍在运行并持续产生输出的子进程,Emacs 将不会接收这些输出。

子进程的输出仅能在 Emacs 处于等待状态时到达:读取终端输入时(参见函数 waiting-for-user-input-p)、在 sit-forsleep-for 中(see 等待时间流逝或输入)、在 accept-process-output 中(see 接收进程输出),以及在向进程发送数据的函数中(see 向进程发送输入)。这最大程度减少了并行编程中常见的时序错误问题。例如,你可以安全地先创建进程,再指定其缓冲区或过滤器函数;只要中间代码不调用任何会等待的原语,输出就不会在你完成设置之前到达。

Variable: process-adaptive-read-buffering

在部分系统上,Emacs 读取子进程输出时,数据会以极小的块被读取,可能导致性能极差。将变量 process-adaptive-read-buffering 设置为非 nil 值(默认值)可在一定程度上改善该问题,它会自动延迟从这类进程读取数据,让进程在 Emacs 尝试读取前生成更多输出。