我正在运行名为 的程序的两个实例SMU
,因此将有两个具有相同名称的独立进程SMU
。并且每个SMU
进程将创建一个(可以超过 1 个)子进程,因此现在将有 4 个具有相同进程名称的进程,如下所示(其中 22313、23835 是两个不同实例的父进程)。
22313 pts/10 00:35:00 SMU
22314 pts/10 00:35:06 SMU
23835 pts/6 00:25:02 SMU
23836 pts/6 00:24:56 SMU
我想编写一个单独的 C 代码,为每个实例创建一个链接列表,以SMU
列出该进程树的所有 PID。
所以我需要知道如何找到正在运行的实例数?如何找到同名的 PID?哪个进程属于哪个进程组以及该进程是子进程还是父进程?
是否有任何 C API 可以为我完成这项工作?如果我必须使用pstree
,我该如何使用它来满足我的要求。
答案1
尝试解析面向用户的命令的输出通常会成为程序中最脆弱的部分,而且是相当脆弱的。(尤其是像 pstree 输出这样复杂的内容。)输出是为人类准备的,不适合计算机使用。它可能在不同程序版本之间发生变化,或者取决于系统区域设置(日期、语言、字符集),或者取决于用户的本地自定义。不要解析 pstree。
在Linux上,枚举进程的主要方法-这来源这些信息– 正在列出子目录/进程名称均为数字。每个这样的目录都代表一个进程,其名称为 PID。可以通过读取/proc/<pid>/status
和查找PPid:
属性(以及Pid:
其自身)来确定其父级。
为了更方便地执行此操作,您可以使用libprocps:新 API- procps_proctab_read()
, 或者旧 API– readproc()
,。readproctab3()
要管理服务的多个实例,请使用服务管理器。大多数 Linux 系统都包含一个服务管理器(称为 systemd)。它会自动跟踪哪些进程属于哪个服务,以便命令systemctl restart smu@foo
(以及相应的 C API)始终选择正确的 PID。