Sorbonne Université Master 2017 2018
PR : Travaux sur Machine 1. Fichiers et Processus

Cette séance est consacrée aux méta-données associées aux fichiers, notamment lorsqu’elles sont utilisées par des processus concurrents. Par rapport à la séance précédente, on sera plus soigneux quant au traitement d’erreur. On pourra s’inspirer du fichier C fourni en annexe pour cela.



Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2017/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2017/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2017/ecrire/inc/distant.php on line 699

1 Recopie de fichier

Ecrire en C un programme qui prend en argument deux noms de fichier et recopie intégralement le contenu du premier dans le second, en utilisant les fonctions POSIX open, read et write. On donnera au deuxième fichier les droits en lecture et écriture pour soi (à l’aide du 3e argument de open ou en appelant la fonction chmod). On veillera à dénoncer (avec la fonction perror) les cas d’erreur suivants :

En cas de réussiste, le programme retourne 0 sinon il retourne la valeur de errno.

Exemple d'appel :
$PWD/bin/mycp src/mycp.c cp.c
Fichier à créer : mycp.c

2 Remontée de valeurs

Ecrire en C un programme prenant en argument un nombre n et un nom de fichier. Le processus principal doit créer n processus fils, à l’aide de fork. Chaque processus fils produit une valeur aléatoire qu’il insère dans le fichier donné en 2e argument, à destination du processus principal. La valeur aléatoire est calculée par la fonction rand ainsi :

(int) (10*(float)rand()/ RAND_MAX)

De son côté, le processus principal doit attendre la terminaison de tous ses fils, puis extraire toutes les valeurs du fichier pour ensuite les additionner et enfin afficher la somme résultante. On pourra utiliser wait ou waitpid appliquée aux résultats de fork pour attendre les terminaisons, puis utiliser lseek. On contrôlera les cas d’erreurs comme à l’exercice précédent.

Exemple d'appel :
$PWD/bin/remonte 8 aleas
Fichier à créer : remonte.c

3 Processus concurrents sur un fichier

On considère le programme forkfile.c fourni en annexe : Quels sont les contenus possibles du fichier fich1 ?

Fichier à créer : forkwrite.txt

4 Fonctions POSIX vs. fonctions C

Écrire en C deux fonctions qui lisent caractère par caractère un fichier passé en argument, et qui affichent chaque caractère dès qu’il est lu. Ces fonctions utiliseront 3 processus partageant le même descripteur et agissant à l’identique (l’identité de chaque processus est affichée avec le caractère lu). La première utilisera les standard POSIX open et read, la seconde fopen et fgetc. Vous écrirez un unique programme qui, selon que son premier argument est -p ou -C appliquera l’une ou l’autre de ces fonctions sur le fichier donné en 2e argument. Vous contrôlerez les cas d’erreur comme précédemment. Quelle différence observez-vous entre les deux modes d’appels ?

Exemple d'appel :
$PWD/bin/lectures -p src/lectures.c; $PWD/bin/lectures -C src/lectures.c
Fichier à créer : lectures.c

5 Annexes


forkfile.c

makefile