Oui. Forking s'écrit &
:
echo child & echo parent
Ce qui peut vous dérouter, c'est que ce $$
n'est pas le PID du processus shell, c'est le PID du processus shell d' origine . Le fait de le faire de cette façon est qu'il $$
s'agit d'un identifiant unique pour une instance particulière du script shell: il ne change pas pendant l'exécution du script, et il est différent de $$
tout autre script exécuté simultanément. Une façon d'obtenir le PID réel du processus shell est sh -c 'echo $PPID'
.
Le flux de contrôle dans le shell n'est pas le même que C. Si en C, vous écririez
first(); fork(); second(); third();
alors un équivalent shell est
after_fork () { second; third; }
first; after_fork & after_fork
La forme simple du shell first; child & parent
correspond à l'idiome C habituel
first(); if (fork()) parent(); else child();
&
et $$
existent et se comportent de cette façon dans chaque shell de style Bourne et dans (t) csh. $PPID
n'existait pas dans le shell d'origine Bourne mais est dans POSIX (donc c'est en ash, bash, ksh, zsh,…).
Gilles 'SO- arrête d'être méchant'
la source
&
est fork, il n'y a pas d'exec impliqué. Fork + exec est lorsque vous lancez une commande externe.exec
, mais les deux langues ont un flux de contrôle différent.&
démarre un sous-shell dans lequel la commande donnée est exécutée. Fork + exec. Vous ne pouvez pas simplement&
exécuter sans commande précédente à exécuter.&
une ligne par lui-même. Mais tu ne peux pas. Cela ne signifie pas "bifurquer ici". Cela signifie "exécuter la commande précédente en arrière-plan dans un sous-shell".Oui, ça s'appelle des sous-coquilles . Le code shell entre parenthèses est exécuté comme un sous-shell (fork). Cependant, le premier shell attend normalement la fin de l'enfant. Vous pouvez le rendre asynchrone à l'aide du
&
terminateur. Voyez-le en action avec quelque chose comme ceci:$ bash subsh.sh
la source
&
est une fourchette seule. Si vous voulez exécuter plus d'un pipeline dans le processus enfant, il suffit d'utiliser des accolades (qui effectuent le regroupement sans créer de processus enfant):{ sleep 2; echo child; } &
Il n'y a pas de méthode bash native (ou, à ma connaissance, tout autre shell * nix typique) pour le faire. Il existe de nombreuses façons de générer des processus forkés qui font autre chose de manière asynchrone, mais je ne pense pas qu'il y ait quoi que ce soit qui suive la sémantique exacte de l'appel système fork ().
L'approche typique consiste à faire en sorte que votre script de niveau supérieur génère des assistants qui effectuent exactement le travail que vous souhaitez répartir. Si vous le faites
$0 $@ &
ou quoi que ce soit, vous recommencerez au début et devrez le comprendre d'une manière ou d'une autre.En fait, je commence à penser à plusieurs façons intelligentes dont on pourrait faire exactement cela ...
Mais , avant que mon cerveau ne s'emballe trop, je pense qu'une assez bonne règle est la suivante: si vous essayez d'écrire quelque chose dans le shell et qu'il y a plein d'astuces intelligentes et que vous souhaitez plus de fonctionnalités linguistiques, il est temps de changer à un vrai langage de programmation .
la source