如何在Linux中为特定程序设置进程ID

时间:2013-08-08 09:35:17

标签: linux process set

我想知道是否有某种方法可以在运行之前强制将某些特定的进程ID用于Linux。我需要提前知道进程ID。

6 个答案:

答案 0 :(得分:24)

实际上,有一种方法可以做到这一点。由于内核3.3设置了CONFIG_CHECKPOINT_RESTORE(在大多数发行版中设置),因此/ proc / sys / kernel / ns_last_pid包含内核生成的最后一个pid。因此,如果要为分叉程序设置PID,则需要执行以下操作:

  1. 打开/ proc / sys / kernel / ns_last_pid并获取fd
  2. 使用LOCK_EX
  3. 来吸引它
  4. 写PID-1
  5. 瞧!孩子将拥有你想要的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的答案中的建议解锁文件。)