Sorbonne Université Master 2017 2018
PR : Travaux Dirigés 10. Entrées-Sorties asynchrones

Cette séance consacrée aux entrées-sorties asynchrones vous est fournie avec le Makefile habituel. Sur vos machines, il faudra utiliser l’option -lrt pour l’édition de lien finale.



1 Asynchronisme avec notification

Ecrire un programme qui prend en argument un nom de fichier et une chaîne de caractères, crée un fichier vide à partir du nom donné en argument, puis écrit la chaîne de caractères dans le fichier avec aio_write, de sorte que la fin de cet appel asynchrone soit notifiée par un signal SIGRTMIN. Pendant l’écriture le programme crée un nouveau descripteur vers le même fichier, puis attend la fin de l’écriture pour aller lire le contenu du fichier et l’affiche avant de se terminer.

Exemple d'appel :
$PWD/bin/notifier_async contenant.txt contenu
Fichier à créer : src/notifier_async.c

2 Asynchronisme avec suspension

Modifier le programme de l’exercice précédent pour que la fin de l’écriture ne soit plus notifiée par signal, mais soit attendue par un appel à aio_suspend. Pendant l’écriture le programme crée un nouveau descripteur vers le même fichier, puis attend la fin de l’écriture pour aller lire, cette fois-ci de manière asynchrone (aio_read), le contenu du fichier et l’affiche avant de se terminer.

Exemple d'appel :
$PWD/bin/suspendre_async contenant.txt contenu
Fichier à créer : src/suspendre_async.c

3 Asynchronisme avec temporisation

Reprenez à nouveau le premier programme en remplaçant la déclaration du signal par celle d’un temporisateur périodique initialisé par timer_create, examinant toutes les 50 nanosecondes si l’écriture est terminée. Si c’est le cas, il affiche le contenu du fichier puis se termine.

Exemple d'appel :
$PWD/bin/temporiser_async contenant.txt contenu
Fichier à créer : src/temporiser_async.c

4 Remontée de valeurs asynchrone

Reprenez l’exercice Remontée de valeurs par partage de mémoire pour que les valeurs aléatoires transmises par les fils soient échangées avec le père en passant par un fichier lu et écrit de manière asynchrone. En commentaire de votre programme, répondez également aux questions suivante :

  1. est-il nécessaire de synchroniser le père avec ses fils pour que les lectures se fassent correctement ?
  2. est-il nécessaire de synchroniser les fils entre eux pour que les écritures se fassent correctement ?
Exemple d'appel :
$PWD/bin/remonte_async 4
Fichier à créer : src/remonte_async.c

5 Inverseur de contenu asynchrone

Ecrire un programme qui lit un fichier par paquet de 10 caractères et les recopie dans un autre fichier en inversant l’ordre des caractères (mais pas des paquets). La lecture est synchrone, mais la recopie est asynchrone pour chaque caractère. Vous utiliserez lio_listio.

Exemple d'appel :
$PWD/bin/inverseur_async source.txt dest.txt
Fichier à créer : src/inverseur_async.c

6 Annexes


makefile
Format de l'envoi : src/notifier_async.c
Répertoires autorisés : src/suspendre_async.c src/temporiser_async.c src/remonte_async.c src/inverseur_async.c