Préparation du shell

Écrivez un programme (en C) qui:

sans créer de fichier temporaire (i.e. en utilisant un pipe).

Shell

Vous trouverez le squelette de base du code C que l’on va utiliser pour recoder un shell. Pour compiler le projet, utilisez la commande . Par défault, le shell ne peut pas faire grand chose. On va essayer de le compléter pas à pas. On va d’abord s’intéresser à la fonction :

Le cas de base, correspond au cas . Donner un exemple de commande qui une fois parsée retourne un objet tel que . En utilisant , observer ce qui se passe dans un terminal lorsque vous lancez une commande.

Pour le moment, toute commande de base sera tout simplement exécutée. Pour exécuter une commande, la librairie glibc offre un panel de fonctions dont on peut avoir un aperçu en utilisant la commande

  man exec

Selon vous, quelle fonction serait la plus appropriée dans notre cas (justifier)? En utilisant toutes ces observations, remplir le trou .

Quel est le symbol pour l’opérateur de séquence en bash? Donner un exemple de commande où la séquence se comporte différent vis-à-vis de l’opérateur et logique.

Implémenter le cas .

Implémenter les cas et .

Il est possible en bash d’écrire une commande de la forme

bash (cmd1 && cmd2 | cmd3 ...) 2>/dev/null

Quel est le rôle des parenthèses dans la commande ci-dessus? Donner un exemple d’une commande qui utilise (de façon non triviale) ces parenthèses. Implémenter le cas .

Que se passe-t-il si vous faites CTRL+C dans notre shell? Proposer une solution pour récupérer la main après que l’utilisateur a entré CTRL+C.

Que se passe-t-il lorsque que vous lancez la commande

  ls > dump

Pour corriger ce problème, je vous invite à lire les pages de manuel et . En utilisant toutes ces informations, implémenter la fonction puis modifier votre implémentation pour que la commande ci-dessus se comporte comme prévu.

Il nous reste finalement à implémenter le cas , pour cela je vous invite à regarder le manuel de . Donner un exemple qui met en évidence pourquoi on ne peut pas simplement utiliser pour réimplémenter le pipe? En utilisant la fonction , réimplémenter le cas .

À ce stade, nous avons implémenté un shell très rudimentaire, cependant il est possible de l’étendre de bien des manières. Voici quelques possibilités d’extensions qui peuvent vous rapporter des points bonus:

Spinlock v. mutex

Quelle est la différence entre un spinlock et un mutex? Pour mettre en évidence cette différence, téléchargez http://www.lsv.fr/~hondet/archisys/12_5/spinvmut.c et complétez le de manière a ce que le fil stupid s’accapare le spinlock et que wants soit forcé d’attendre la libération de la ressource (exclusion mutuelle).

Que donnera un appel à time? Modifiez le code pour utiliser des mutex à la place. Que devrait donner time? Vérifiez.

La fonction d’Hénon, partie II

On va (re) calculer l’orbite d’un système dynamique de dimension 2. La fonction d’Hénon est définie par le système \displaystyle \label{eq:1} H_{a,b} = \left\{ \begin{aligned} x_{n} &= a - by_{n} - x_{n}^{2} \\ y_{n} &= x_{n}. \end{aligned} \right. On utilisera un thread pour calculer la suite (x_n)_n et un autre thread pour la suite (y_n)_n .

Proposez un moyen de synchronisation permettant d’assurer l’entrelacement des calculs de x_n et de y_n . Mettez le en œuvre.

On peut ensuite créer un modèle dit producteur consommateur:

Le fichier henon.dat sera sous la forme 0.3415 1.2451 où le premier nombre est x_{n} et le deuxième y_{n}.

On pourra tracer la fonction avec la commande gnuplot henon.p après avoir téléchargé le script http://www.lsv.fr/~hondet/archisys/henon.p. Cela produira un fichier henon.png.

Pour a = 1.4 et b = -0.3 , la fonction est chaotique (au sens de Devaney), c’est-à-dire,

et possède un attracteur étrange.

Pour plus d’informations sur les systèmes dynamiques, voir An introduction to Chaotic Dynamical Systems, Robert L. Devaney, Westview.

Sémaphores inter processus

Les semaphores, bien qu’introduits avec les threads, permettent également la synchronisation inter processus. Pour ce faire, l’API System V fournit des procédures IPC pour Inter Process Communication. Par exemple, on peut obtenir des sémaphores via semget. Cette commande utilise des clefs IPC permettant d’identifier de manière unique un ensemble de sémaphores.

Ces clefs peuvent être générées par la fonction ftok.

Pour expérimenter un peu, écrivez un programme créant une clef et deux sémaphores avec cette clef. Lancez le programme et exécutez la commande ipcs -s. Que constate-t-on? On en déduira les précautions à prendre lorsque l’on utilise des clefs. La commande ipcrm existe.

On peut maintenant implémenter la fonction d’Hénon multi processus avec des sémaphores.