Exécution de commandes en parallèle

Introduction

Le but de ce TP est de concevoir en C une commande parexec qui prend en argument en ligne de commande un nom de programme prog suivi d'une liste arbitrairement longue d'arguments, et qui exécute prog en parallèle sur chacun des arguments. Par exemple, la commande:

./parexec md5sum fichier1 fichier2 ... fichierN

lancera en parallèle les commandes md5sum fichier1, md5sum fichier2, ..., md5sum fichierN.

Exercices

1) Programmez parexec à l'aide de fork(2) et execlp(2) (ou tout autre fonction de la famille de exec). parexec ne doit rendre la main que quand toutes les exécutions de prog se sont terminées.

Que se passe-t-il si on tape Contrôle+C?

Indices.

2) Modifiez parexec pour qu'il prenne un argument supplémentaire entre prog et fichier1: le nombre maximum d'instances de prog à lancer en parallèle. Quand ce nombre est atteint, parexec doit attendre qu'un des appels se termine avant d'en lancer un nouveau.

Écrivez un petit programme compte qui effectue un compte à rebours seconde par seconde à partir d'un nombre passé en argument. Sur chaque ligne, compte affichera le nombre de secondes restantes ainsi que son pid (afin de l'identifier facilement en cas d'exécutions multiples). Une commande telle que ./parexec ./compte 2 4 5 6 7 devrait alors vous permettre de tester facilement votre nouveau parexec.

Indices.

3) Modifiez parexec pour que, si une des instances de prog se termine anormalement (sur un signal) alors il ne lance plus de nouvelles instances de prog. À la place, il attend que les instances déjà lancées se terminent et quitte.

Qu'arrive-t-il aux instances déjà lancées de prog si parexec quitte sans attendre qu'elles se terminent?

Indices.

4) Modifiez parexec pour que, si une des instances de prog se termine anormalement, alors il termine immédiatement toutes les instances de prog déjà lancées et quitte.

Testez votre parexec avec une version de compte modifiée pour afficher un message en cas d'interruption par un signal.

Indices.

5) Ajoutez à parexec une limite de 10 secondes d'exécution. Passé ce délai, il devra terminer de force toutes les commandes non encore terminées et quitter.

Indices.


Antoine Miné