How to set process ID in Linux for a specific prog

2019-01-18 03:41发布

问题:

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.

回答1:

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.



回答2:

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


回答3:

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



回答4:

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



回答5:

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.