如果我知道进程组 id, 有什么途径能够获取进程组下的所有 pid? (golang , 不能是 ps -ejf ,linux openwrt 系统上 ps 不支持 ejf)
我启动了一个 A 进程, pid = 255, pgid(进程组 id) = 255, A 进程启动了 B/C/D 子进程,所有子进程的 pgid 都是 255 。
基于上面的问题我就很好奇一个问题,进程 id 和进程组 id 以及会话 id 应该是共享一个数字递增池的吧,进程 id 生成的时候回检查进程 id 和进程组 id 是否存在,存在就跳过这个 id?
1
Cyshall 2022-05-26 12:05:37 +08:00
问题 2:会,只不过几率很小,主要是 Linux 会在进程数量达到最大的时候重复利用之前的进程 ID ,只要重复利用之前的进程 ID ,就存在你说的那种可能,而在 64 位系统下,我记得 Linux 最大进程数量是几百万个。
问题 3:进程 ID 会一直不断的+1 ,只要拿到进程 ID 就一定表示没有被使用(排除重复利用进程 ID 的情况),所以不存在检不检查进程 ID 。 |
2
codehz 2022-05-26 13:15:00 +08:00 via Android
问题 1 自己遍历 /proc/[pid]/stat 里面有 pgid 信息)
|
3
ysc3839 2022-05-26 13:25:56 +08:00 via Android
1.看支持这个功能的 ps 的代码,自己翻译成 golang
|
4
ch2 2022-05-26 13:48:33 +08:00 via iPhone 1
3. 内核会把上一次分配的 pid 保存在 /proc/sys/kernel/ns_last_pid 里(这个文件也是可写的),下一个创建的进程会获得取值+1 的 pid 。如果你在这个文件里指定了一个已经被分配的 pid ,那么内核会尝试依次+1 顺延到找到一个可用的 pid 为止
|