How to set process ID in Linux for a specific prog

2019-01-18 03:43发布

I was wondering if there is some way to force to use some specific process ID to Linux to some application before running it. I need to know in advance the process ID.

5条回答
女痞
2楼-- · 2019-01-18 04:11

You could just repeatedly call fork() to create new child processes until you get a child with the desired PID. Remember to call wait() often, or you will hit the per-user process limit quickly.

This method assumes that the OS assigns new PIDs sequentially, which appears to be the case eg. on Linux 3.3.

The advantage over the ns_last_pid method is that it doesn't require root permissions.

查看更多
时光不老,我们不散
3楼-- · 2019-01-18 04:12

As many already suggested you cannot set directly a PID but usually shells have facilities to know which is the last forked process ID.

For example in bash you can lunch an executable in background (appending &) and find its PID in the variable $!. Example:

$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
查看更多
Ridiculous、
4楼-- · 2019-01-18 04:17

There's no way to force to use specific PID for process. As Wikipedia says:

Process IDs are usually allocated on a sequential basis, beginning at 0 and rising to a maximum value which varies from system to system. Once this limit is reached, allocation restarts at 300 and again increases. In Mac OS X and HP-UX, allocation restarts at 100. However, for this and subsequent passes any PIDs still assigned to processes are skipped

查看更多
贪生不怕死
5楼-- · 2019-01-18 04:22

Every process on a linux system is generated by fork() so there should be no way to force a specific PID.

查看更多
smile是对你的礼貌
6楼-- · 2019-01-18 04:23

Actually, there is a way to do this. Since kernel 3.3 with CONFIG_CHECKPOINT_RESTORE set(which is set in most distros), there is /proc/sys/kernel/ns_last_pid which contains last pid generated by kernel. So, if you want to set PID for forked program, you need to perform these actions:

  1. Open /proc/sys/kernel/ns_last_pid and get fd
  2. flock it with LOCK_EX
  3. write PID-1
  4. fork

Voilà! Child will have PID that you wanted. Also, don't forget to unlock (flock with LOCK_UN) and close ns_last_pid.

You can checkout C code at my blog here.

查看更多
登录 后发表回答