[gull] Truc et astuces: multithread en bash
Daniel Cordey
dc at pxcluster.com
Mon Dec 28 20:20:20 CET 2020
On 28/12/2020 17:01, felix wrote:
> Bonjour,
>
> J'ai pondu, en guise de démo multithread un petit ``multiping'' en bash:
Salut Félix,
Jolie démo !
Toutefois, et sans vouloir me montrer trop maniaque, il s'agit là plutôt
de multi-processing et non de vrai multi-threading. Le multi-threading
conserve l'accès à la zone data du process, or 'exec' efface cette zone
pour mettre la sienne à la place. Oui, en faisant 'exec' on conserve le
PID, mais on ne crée pas un trhead au sens système. Aussi, l'usage de :
<(ping ...)
est un sub-shell, on a donc un process différent. Si l'on avait la
possibilité de faire du vrai multi-threading, on n'aurait pas besoin de
passer des paramètres entre les différentes "parties" en utilisant des
fichiers. On pourrait lors le faire en partageant une même variable.
Toute chose qui est impossible avec l'utilisation d'exec() et de sub-shell.
Pour résumer, le shell initial lit le stdin et attend une commande,
pendant que le 'ping' est exécuté dans un autre process et va recevoir
un signal lui disant de se terminer. Tout ceci est d'ailleurs très clair
à partir du moment où on utilise '$!' qui est le PID du dernier process
exécuté un background. A la décharge de bash, il est très facile de
simuler du multi-threading en faisant du multi-process, puisque l'on
dispose justement de la commande 'wait' qui rend la chose assez
transparente, et est très proche de ce que l'on fait en multi-threading
en C, Python, etc. Sauf que l'on a un problème pour passer des data;
d'où l'utilisation de fichiers dans ce cas.
Aussi, 'ping' n'étant pas une commande interne du shell, celle-ci est
obligatoirement exécutée dans un sous-process. Tout ceci serait fort
différent si 'ping' était justement une commande intégrée à bash. Mais,
c'est le même problème pour tous les langages, 'ping' est une commande
qui est aussi utilisée en appelant un shell depuis Python ou PHP. Si
l'on ne veut pas utiliser cette commande, il faut alors simuler le
'ping' en utilisant des commandes de bas niveau des paquets (ICMP); cela
est possible si l'on a accès à des librairies de bas niveau (nécessitant
d'être root). Ceci est possible en Python avec un module comme
'pythonping' qui simule justement un ping sans utiliser la commande
'ping'. Il y a peut-être des librairies de ce genre en PHP ou Perl, mais
il faudrait une version vraiment spéciale de bash pour avoir cette même
fonctionnalité.
dc
More information about the gull
mailing list