web-dev-qa-db-fra.com

obtenez pid dans Shell (bash)

J'ai un problème avec Bash et je ne sais pas pourquoi.
Sous Shell, j'entre:

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

"getpid" est un programme en C pour obtenir le pid actuel, comme:

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

Ce qui me trouble, c'est que:

  1. Je pense que "(commande)" est un sous-processus (je suis correct?), Et je pense que son pid devrait être différent de son pid parent, mais ils sont les mêmes, pourquoi ...
  2. quand j'utilise mon programme pour montrer pid entre parenthèses, le pid qu'il montre est différent, n'est-ce pas?
  3. '$$' ressemble-t-il à la macro?

Pouvez-vous m'aider?

132
ruanhao

$$ est défini pour renvoyer l'ID de processus du parent dans un sous-shell; dans la page de manuel sous "Paramètres spéciaux":

$ Étend à l'ID de processus du shell. Dans un sous-shell (), il se développe en identifiant de processus du shell actuel, pas du sous-shell.

Dans bash 4, vous pouvez obtenir l'ID de processus de l'enfant avec BASHPID.

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
183
chepner

Vous pouvez utiliser l'un des éléments suivants.

  • $! est le PID du dernier processus en arrière-plan.
  • kill -0 $PID vérifie s'il est toujours en cours d'exécution.
  • $$ est le PID du shell actuel.
75
craken
  1. Les parenthèses invoquent un sous-shell dans Bash . Comme il ne s'agit que d'un sous-shell, il peut avoir le même PID - cela dépend de la mise en œuvre.
  2. Le programme C que vous appelez est un processus distinct, qui possède son propre PID unique. Peu importe qu'il soit dans un sous-shell ou non.
  3. $$ est un alias dans Bash avec le PID de script actuel . Voir différences entre $$ et $BASHPID ici , et juste au-dessus de celle de la variable supplémentaire $BASH_SUBSHELL qui contient le niveau d'imbrication.
24
Niels Keurentjes

Essayez getppid() si vous voulez que votre programme C imprime le PID de votre Shell.

4
Alex

Si vous demandiez comment obtenir le PID d'une commande connue, cela ressemblerait à quelque chose comme ceci:

Si vous aviez émis la commande ci-dessous #La commande émise était ***

dd if =/dev/diskx de =/dev/disky


Vous utiliseriez alors:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

Qu'est-ce qui se passe ici est qu'il dirige tous les caractères uniques nécessaires à un champ et ce champ peut être répété en utilisant

echo $ PID

1
Don-Pierre Halfaway

celui-ci manière universelle pour obtenir le pid correct

pid=$(cut -d' ' -f4 < /proc/self/stat)

même Nice a travaillé pour sous

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

vérifier la sortie

pid = 8099
8099 != 8100
0
ARTEM LAPKIN