[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