J'ai un problème avec Bash et je ne sais pas pourquoi.
Sous coquille, j'entre:
echo $$ ## print 2433
(echo $$) ## also print 2433
(./getpid) ## print 2602
"getpid" est un programme C pour obtenir le pid actuel, comme:
int main() { printf("%d", (int)getpid()); return 0; }
Ce qui me trouble, c'est que:
- Je pense que "(commande)" est un sous-processus (ai-je raison?), Et je pense que son pid devrait être différent de son pid parent, mais ils sont les mêmes, pourquoi ...
- quand j'utilise mon programme pour afficher pid entre parenthèses, le pid qu'il montre est différent, n'est-ce pas?
- '$$' est-il quelque chose comme une macro?
Pouvez-vous m'aider?
getpid
cela afficherait un ID de processus différent même s'il n'était pas exécuté dans un sous-shell.echo $$ $BASHPID ; ( echo $$ $BASHPID )
démontre que c'est le cas. Les crochets ronds créent un sous-shell. Les instructions peuvent changer les valeurs des variables et le shell parent ne doit pas voir ces changements. Ceci est implémenté comme unefork()
opération.Réponses:
$$
est défini pour renvoyer l'ID de processus du parent dans un sous-shell; depuis la page de manuel sous "Paramètres spéciaux":Dans
bash
4, vous pouvez obtenir l'ID de processus de l'enfant avecBASHPID
.la source
echo $$; (echo $$; (echo $$))
fait écho trois fois au même pid$ Expands to the process ID of the shell
est-ce que c'est tho?echo $
fait juste écho au littéral $.$
à lui seul, ce n’est pas une expansion des paramètres. La page de manuel fait référence au nom du paramètre spécial, qui est$
; il ne prétend pas que$
seul se développe.echo $BASHPID
fonctionne en bash 4 et 5 (mais pas en version 3.2.57 sur MacOS)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.la source
kill -0 $!
si nous parlons de processus d'arrière-plan?PID
n'est défini sur rien par défaut.$$
est un alias dans Bash du PID de script courant . Voir les différences entre$$
et$BASHPID
ici , et juste au-dessus de la variable supplémentaire$BASH_SUBSHELL
qui contient le niveau d'imbrication.la source
Essayez
getppid()
si vous voulez que votre programme C imprime le PID de votre shell.la source
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 ***
Ensuite, vous utiliseriez:
Ce qui se passe ici, c'est que tous les caractères uniques nécessaires sont redirigés vers un champ et que ce champ peut être renvoyé en utilisant
echo $ PID
la source
cette façon unique d'obtenir un pid correct
pid=$(cut -d' ' -f4 < /proc/self/stat)
même gentil travaillé pour le sous
vérifier la sortie
la source