In realtà, c'è un modo per farlo. Dal kernel 3.3 con CONFIG_CHECKPOINT_RESTORE impostato (che è impostato nella maggior parte delle distribuzioni), c'è /proc/sys/kernel/ns_last_pid che contiene l'ultimo pid generato dal kernel. Quindi, se vuoi impostare il PID per il programma biforcuto, devi eseguire queste azioni:
- Apri /proc/sys/kernel/ns_last_pid e ottieni fd
- floccalo con LOCK_EX
- scrivi PID-1
- forchetta
Ecco! Il bambino avrà il PID che volevi. Inoltre, non dimenticare di sbloccare (flock con LOCK_UN) e chiudere ns_last_pid.
Puoi controllare il codice C sul mio blog qui.
Come molti hanno già suggerito, non è possibile impostare direttamente un PID, ma di solito le shell hanno funzionalità per sapere qual è l'ultimo ID di processo biforcuto.
Ad esempio in bash puoi pranzare un eseguibile in background (aggiungendo &
) e trova il suo PID nella variabile $!
.Esempio:
$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
Su CentOS7.2 puoi semplicemente fare quanto segue:
Diciamo che vuoi eseguire il comando sleep con un PID di 1894.
sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
(Tuttavia, tieni presente che se per caso un altro processo viene eseguito nel brevissimo lasso di tempo tra il comando echo e sleep potresti finire con un PID di 1895+. L'ho provato centinaia di volte e non è mai successo Se vuoi garantire il PID dovrai bloccare il file dopo averlo scritto, eseguire sleep, quindi sbloccare il file come suggerito nella risposta di Ruslan sopra.)