向子进程 发送信号(Sending a signal) 是中断其运行的一种方式。存在多种不同信号,每种信号均有其特定含义。信号的集合及其名称由操作系统定义。例如,信号 SIGINT 表示用户按下了 C-c,或发生了类似的操作。
每种信号对子进程都有标准作用。大多数信号会终止子进程,但部分信号会暂停(或恢复)其执行。大多数信号可由程序选择性处理;若程序对信号进行了处理,则通常无法预判其具体效果。
你可以通过调用本节中的函数显式发送信号。Emacs 也会在特定场景下自动发送信号:关闭缓冲区时会向其关联的所有进程发送 SIGHUP 信号;退出 Emacs 时会向所有剩余进程发送 SIGHUP 信号。(SIGHUP 通常表示用户“挂断连接”,即断开终端。)
每个发送信号的函数均接受两个可选参数:process 与 current-group。
参数 process 必须是进程、进程名、缓冲区、缓冲区名或 nil。缓冲区或缓冲区名通过 get-buffer-process 关联到对应进程。nil 表示当前缓冲区关联的进程。除 stop-process 与 continue-process 外,若 process 无法标识一个活动进程,或代表网络、串口、管道连接,则会抛出错误。
参数 current-group 是一个标志位,当 Emacs 子进程为作业控制 Shell 时该参数会产生作用。若其非 nil,信号会被发送到 Emacs 与子进程通信所用终端的当前进程组。若该进程是作业控制 Shell,则表示 Shell 的当前子任务。若 current-group 为 nil,信号会被发送到 Emacs 直接子进程的进程组;若子进程是作业控制 Shell,则目标为 Shell 本身。若 current-group 为 lambda,信号会被发送到持有终端的进程组,但仅当该进程组不是 Shell 自身时生效。
当使用管道与子进程通信时,标志 current-group 不会生效,因为操作系统在管道场景下不支持该区分。出于相同原因,作业控制 Shell 在管道模式下无法正常工作。详见 创建异步进程 中的 process-connection-type。
该函数通过发送信号 SIGINT 中断进程 process。在 Emacs 外部,输入中断字符(部分系统默认为 C-c,其他系统为 DEL)会发送该信号。当参数 current-group 非 nil 时,可将该函数理解为在 Emacs 与子进程通信的终端上按下 C-c。
该命令通过发送信号 SIGKILL 终止进程 process。该信号会立即终止子进程,且子进程无法对其进行处理。交互调用时,会提示用户输入进程名,默认使用当前缓冲区关联的进程(若存在)。
该函数向进程 process 发送信号 SIGQUIT。该信号对应 Emacs 外部输入退出字符(通常为 C-\)时触发的信号。
该函数暂停指定的 process。若为运行程序的真实子进程,会向其发送信号 SIGTSTP。若 process 代表网络、串口或管道连接,该函数会暂停处理来自该连接的传入数据;对于网络服务器,则表示不再接受新连接。使用 continue-process 可恢复正常执行。
在 Emacs 外部,支持作业控制的系统中,暂停字符(通常为 C-z)通常会向子进程发送 SIGTSTP 信号。当 current-group 非 nil 时,可将该函数理解为在 Emacs 与子进程通信的终端上按下 C-z。
该函数恢复进程 process 的执行。若为运行程序的真实子进程,会向其发送信号 SIGCONT,前提是该进程此前已被暂停。若 process 代表网络、串口或管道连接,该函数会恢复处理来自该连接的传入数据。对于串口连接,进程暂停期间到达的数据可能会丢失。
该函数向进程 process 发送信号。参数 signal 指定要发送的信号,其值应为整数,或名称为信号名的符号。
参数 process 可以是系统进程 ID(整数),借此可向非 Emacs 子进程的进程发送信号。See 访问其他进程。
若 process 是包含 remote-pid 属性的进程对象,或 process 为数字且 remote 为远程文件名,则 process 会被解释为对应远程主机上的目标进程并发送信号。
若 process 为字符串,会被解释为对应名称的进程对象,或数字。
有时需要向非本地的异步进程发送信号。可通过自行实现 interrupt-process 或 signal-process 完成该操作,之后将该函数分别添加到 interrupt-process-functions 或 signal-process-functions 中。
该变量是一个函数列表,调用 interrupt-process 时会依次执行这些函数。函数参数与 interrupt-process 一致。列表中的函数会按顺序调用,直至其中一个返回非 nil 值。默认函数 internal-default-interrupt-process 应始终位于列表末尾。
Tramp 正是通过该机制实现 interrupt-process。
该变量是一个函数列表,调用 signal-process 时会依次执行这些函数。函数参数与 signal-process 一致。列表中的函数会按顺序调用,直至其中一个返回非 nil 值。默认函数 internal-default-signal-process 应始终位于列表末尾。
Tramp 正是通过该机制实现 signal-process。