web-dev-qa-db-fra.com

Comment définir l'ID de processus sous Linux pour un programme spécifique

Je me demandais s’il était possible de forcer l’utilisation d’un identifiant de processus spécifique sous Linux pour certaines applications avant de l’exécuter. J'ai besoin de connaître à l'avance l'identifiant du processus.

15
Borja Tarraso

En fait, il existe un moyen de le faire. Depuis le noyau 3.3 avec CONFIG_CHECKPOINT_RESTORE défini (qui est défini dans la plupart des distributions), il existe/proc/sys/kernel/ns_last_pid qui contient le dernier pid généré par le noyau. Donc, si vous voulez définir le PID pour le programme forké, vous devez effectuer les actions suivantes:

  1. Ouvrez/proc/sys/kernel/ns_last_pid et récupérez fd
  2. le grouper avec LOCK_EX
  3. écrire PID-1
  4. fork

Voilà! L'enfant aura le PID que vous vouliez. N'oubliez pas non plus de déverrouiller (flock avec LOCK_UN) et de fermer ns_last_pid.

Vous pouvez commander le code C sur mon blog ici .

21
Ruslan Kuprieiev

Comme beaucoup l'ont déjà suggéré, vous ne pouvez pas définir directement un PID, mais les shells ont généralement la possibilité de savoir quel est le dernier ID de processus créé.

Par exemple, dans bash, vous pouvez lancer un exécutable en arrière-plan (en ajoutant &) et trouver son PID dans la variable $!. Exemple:

$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
4
Elisiano Petrini

Il n'y a aucun moyen de forcer l'utilisation d'un PID spécifique pour le processus. Comme Wikipedia dit:

Les ID de processus sont généralement attribués de manière séquentielle, commençant à 0 et atteignant une valeur maximale qui varie d’un système à l’autre. Une fois cette limite atteinte, l’attribution reprend à 300; ____.] augmente. Sous Mac OS X et HP-UX, l'allocation redémarre à 100. Toutefois, Pour cette étape et les suivants, tous les PID encore attribués aux processus Sont ignorés.

2
Oscerd

Chaque processus sur un système Linux est généré par fork () , il ne devrait donc y avoir aucun moyen de forcer un PID spécifique.

1
deagh

Vous pouvez simplement appeler à plusieurs reprises fork() pour créer de nouveaux processus enfants jusqu'à ce que vous obteniez un enfant avec le PID souhaité. N'oubliez pas d'appeler wait() souvent, sinon vous atteindrez rapidement la limite de processus par utilisateur.

Cette méthode suppose que le système d'exploitation affecte les nouveaux PID de manière séquentielle, ce qui semble être le cas, par exemple. sur Linux 3.3.

L'avantage par rapport à la méthode ns_last_pid est qu'elle ne nécessite pas d'autorisations root.

1
oliver