我想知道是否有某种方法可以在运行之前强制将某些特定的进程ID用于Linux。我需要提前知道进程ID。
答案 0 :(得分:24)
实际上,有一种方法可以做到这一点。由于内核3.3设置了CONFIG_CHECKPOINT_RESTORE(在大多数发行版中设置),因此/ proc / sys / kernel / ns_last_pid包含内核生成的最后一个pid。因此,如果要为分叉程序设置PID,则需要执行以下操作:
瞧!孩子将拥有你想要的PID。 另外,不要忘记解锁(使用LOCK_UN聚集)并关闭ns_last_pid。
您可以在我的博客here结帐C代码。
答案 1 :(得分:4)
正如许多人已经建议的那样,你不能直接设置一个PID,但通常shell都有设施知道哪个是最后一个分叉的进程ID。
例如,在bash中,您可以在后台午餐(附加&
)并在变量$!
中查找其PID。
例如:
$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
答案 2 :(得分:2)
没有办法强制使用特定的PID进程。正如Wikipedia所说:
进程ID通常按顺序分配,从...开始 0并上升到最大值,因系统而异。 达到此限制后,分配将在300再次重新启动 增加。在Mac OS X和HP-UX中,分配重新启动为100.但是, 对于此次和后续传递,任何PID仍分配给进程 被跳过
答案 3 :(得分:1)
Linux系统上的每个进程都是由 fork()生成的,因此无法强制使用特定的PID。
答案 4 :(得分:1)
您可以重复调用fork()
以创建新的子进程,直到获得具有所需PID的子进程为止。请记住经常拨打wait()
,否则您将很快达到每个用户的进程限制。
此方法假定操作系统按顺序分配新的PID,例如,在Linux 3.3上。
与ns_last_pid
方法相比,优点是它不需要root权限。
答案 5 :(得分:0)
在CentOS7.2上,您可以简单地执行以下操作:
假设您要执行PID为1894的sleep命令。
sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
(但是,请记住,如果偶然地在回声和睡眠命令之间的极短时间内执行了另一个进程,则最终可能会得到1895+的PID。我已经对其进行了数百次测试,从来没有发生过。如果要保证PID,则需要在写入文件后锁定文件,执行睡眠,然后按照上述Ruslan的答案中的建议解锁文件。)