41.7 向进程发送输入

异步子进程会在 Emacs 向其发送输入时接收数据,本节中的函数用于完成该操作。你必须指定要发送输入的目标进程,以及需要发送的输入数据。如果子进程正在运行某个程序,这些数据会出现在该程序的标准输入中;对于连接类进程,数据会被发送到对应的设备或程序。

部分操作系统对 pty 中的缓冲输入空间存在限制。在这类系统上,Emacs 会在其他字符之间周期性地发送一个 EOF,以强制数据通过缓冲区。对大多数程序而言,这些 EOF 不会产生不良影响。

子进程输入在被接收前,通常会通过编码系统进行编码,这与写入文件的文本处理方式类似。你可以使用 set-process-coding-system 指定所用的编码系统(see 进程信息)。若未指定,则编码系统取自 coding-system-for-write(当其非 nil 时);否则取自默认机制(see 默认编码系统)。

有时系统无法接收对应进程的输入,原因是输入缓冲区已满。出现这种情况时,发送函数会短暂等待,接收子进程的输出,之后再次尝试。这能让子进程有机会读取更多待处理的输入,从而在缓冲区中腾出空间。该过程同时也会运行过滤器(包括当前正在执行的过滤器)、哨兵函数与定时器——因此编写代码时需要考虑这一点。

在这些函数中,参数 process 可以是一个进程、进程名、缓冲区或缓冲区名(通过 get-buffer-process 关联到对应进程)。nil 表示当前缓冲区关联的进程。

Function: process-send-string process string

该函数将 string 的内容作为标准输入发送给 process,返回 nil。例如,让 Shell 缓冲区列出文件:

(process-send-string "shell<1>" "ls\n")
     ⇒ nil
Function: process-send-region process start end

该函数将由 startend 界定的区域内文本作为标准输入发送给 process

除非 startend 均为整数或标记且指向当前缓冲区中的位置,否则会抛出错误。(两个数值的大小顺序无关紧要。)

Function: process-send-eof &optional process

该函数让 process 在其输入中感知到文件结束符。该 EOF 会出现在所有已发送文本之后。函数返回 process

(process-send-eof "shell")
     ⇒ "shell"
Function: process-running-child-p &optional process

该函数用于判断一个 process(必须是真实子进程而非连接)是否将其终端控制权交给了自身的子进程。若成立,函数返回 process 的前台进程组的数字 ID;若 Emacs 可确定不成立,则返回 nil;若 Emacs 无法判断,则返回 t。如果 process 是网络、串口或管道连接,或子进程未处于活动状态,该函数会抛出错误。