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

_______________________________________________
gull mailing list
[email protected]
https://forum.linux-gull.ch/mailman/listinfo/gull

Répondre à