41.12 访问其他进程

除了访问和操作属于当前 Emacs 会话的子进程外,Emacs Lisp 程序还可以访问系统中的其他进程。我们将这些称为系统进程(ystem processes),以与 Emacs 子进程区分。

Emacs 提供若干原语用于访问系统进程。并非所有平台都支持这些原语;不支持的平台上,这些原语会返回 nil

Function: list-system-processes

该函数返回系统上正在运行的所有进程的列表。每个进程由其 PID 标识,即操作系统分配的数字型进程 ID,用于在同一时刻同一台机器上唯一区分各个进程。

default-directory 指向远程主机,则返回该主机上的进程。

Function: process-attributes pid

该函数返回进程 ID 为 pid 的进程的属性关联列表。关联列表中的每个元素格式为 (key . value),其中 key 表示属性名称,value 为对应属性的值。下面列出该函数可能返回的各类属性 key。并非所有平台都支持全部属性;若某个属性不被支持,其关联项不会出现在返回的关联列表中。

default-directory 指向远程主机,则 pid 被视为该远程主机上的进程 ID。

euid

运行该进程的用户的有效用户 ID,对应 value 为数字。若进程由运行当前 Emacs 会话的同一用户启动,该值与 user-uid 返回结果相同(see 用户标识)。

user

与进程有效用户 ID 对应的用户名,为字符串。

egid

有效用户 ID 对应的组 ID,为数字。

group

与有效用户组 ID 对应的组名,为字符串。

comm

进程中运行的命令名称。通常是进程可执行文件的名称(不含路径),字符串类型。但部分特殊系统进程可能返回与程序可执行文件无关的字符串。

state

进程状态码,为简短字符串,用于表示进程的调度状态。常见状态码如下:

"D"

不可中断睡眠(通常为 I/O 操作)

"R"

运行中

"S"

可中断睡眠(等待某事件)

"T"

已暂停,例如被作业控制信号暂停

"Z"

僵尸进程:已终止但未被父进程回收的进程

完整状态列表可参考 ps 命令手册。

ppid

父进程的进程 ID,为数字。

pgrp

进程所属的进程组 ID,为数字。

sess

进程的会话 ID,为数字,即该进程会话领头进程(session leader)的 PID。

ttname

进程控制终端名称,字符串。在类 Unix 与 GNU 系统上,通常为对应终端设备的文件名,如 /dev/pts65

tpgid

使用该进程终端的前台进程组的数字 ID。

minflt

进程自启动以来产生的次要页错误数量(次要页错误无需读取磁盘)。

majflt

进程自启动以来产生的主要页错误数量(主要页错误需要磁盘读取,开销高于次要页错误)。

cminflt
cmajflt

minfltmajflt 类似,但包含该进程所有子进程的页错误数量。

utime

进程在用户态运行应用代码所消耗的时间,对应 value 为 Lisp 时间戳(see 时刻)。

stime

进程在内核态处理系统调用所消耗的时间,对应 value 为 Lisp 时间戳。

time

utimestime 之和,对应 value 为 Lisp 时间戳。

cutime
cstime
ctime

utimestimetime 类似,但包含该进程所有子进程的对应时间。

pri

进程的数字优先级。

nice

进程的nice 值,数字。nice 值越小,进程调度优先级越高。

thcount

进程中的线程数量。

start

进程启动时间,以 Lisp 时间戳表示。

etime

进程自启动以来经过的时间,以 Lisp 时间戳表示。

vsize

进程虚拟内存大小,单位为 KB。

rss

进程常驻集(resident set)大小,即进程在物理内存中占用的 KB 数量。

pcpu

进程自启动以来占用 CPU 时间的百分比。对应 value 为非负浮点数。理论上多核平台该值可超过 100%,但因 Emacs 通常单线程运行,实际一般小于 100%。

pmem

进程常驻集占用系统总物理内存的百分比,值为 0 到 100 之间的浮点数。

args

启动进程时使用的命令行参数。字符串格式,各参数以空格分隔;参数中包含的空白字符会按系统 Shell 规则适当转义:GNU/Unix 平台使用反斜杠转义,Windows 平台使用双引号包裹。因此该字符串可直接用于 shell-command 等原语。