1 Fichiers temporaires
L'objectif est la construction d'une fonction mktmpfile() de
création d'un fichier temporaire à la manière de la fonction
tmpfile() existante dans la bibliothèque standard. Un tel
fichier temporaire sera unique, et ainsi le programme l'ayant créé
pourra en faire librement usage.
La fonction de la bibliothèque C standard tempnam() crée un
nom qui pourra être utilisé pour un fichier temporaire :
#include <stdio.h>
char *tempnam(const char *dir, const char *pfx);
L'utilisateur choisit le répertoire dans lequel le fichier devra être
créé, argument dir. L'utilisateur peut aussi choisir un
préfixe au nom du fichier. L'argument pfx, s'il est non
nul, doit référencer une chaîne d'au plus cinq caractères qui sera
utilisée comme préfixe.
En cas de succès, tempnam() alloue dynamiquement la mémoire
nécessaire au résultat, y copie le nom absolu du fichier et retourne
un pointeur sur cette mémoire. Ce pointeur devrait être passé en
argument à free() par l'utilisateur pour libérer cette mémoire.
En cas d'erreur, un pointeur nul est retourné et errno et
positionné.
Par exemple, l'extrait de code
char *fname;
fname = tempnam("/tmp", "foo");
if (fname)
printf("%s\n", fname);
pourrait afficher le résultat suivant :
/tmp/foo0029ab
Attention, la fonction tempnam() crée juste le nom de
fichier. C'est à l'utilisateur de créer et de détruire le
fichier. Entre le moment de création du nom et le moment auquel le
fichier est créé, il est possible qu'un autre processus ait créé un
fichier avec ce même nom.
Exercice 1
Quel mode d'ouverture de fichier permet d'identifier qu'un autre
processus n'a pu créer le fichier entre temps ?
On notera que dans ce cas, la primitive d'ouverture de fichier
retourne une erreur (-1) et positionne errno à
EEXIST si le fichier existe déjà.
La fonction
int mktmpfile(void);
retourne un descripteur sur un fichier temporaire qui vient d'être
créé et ouvert en lecture/écriture. Cette fonction fait des appels à
la fonction tempnam() jusqu'à ce que le fichier dont le nom
est retourné puisse être ouvert en création par le programme sans
erreur. Ce fichier temporaire est créé dans le répertoire désigné
par la variable d'environnement $TMPDIR si elle est positionnée, dans le répertoire /tmp sinon. En cas
d'erreur (par exemple allocation mémoire impossible...) la fonction
retourne la valeur -1.
Exercice 2
Donnez le principe et le code C d'une implantation de la fonction
mktmpfile().
La documentation de la fonction standard tmpfile() indique
que le fichier temporaire créé sera automatiquement détruit
lorsque toutes les références au fichier seront fermées.
L'implantation habituelle de tmpfile() assure cette
fonctionnalité par un appel à unlink() avant de retourner le
descripteur.
Exercice 3
Expliquez le mécanisme qui garantit que l'implantation habituelle
respecte cette destruction « automatique » du fichier
temporaire.
Exercice 4
Une solution pour adresser le problème de l'éventuelle création du
fichier temporaire par un autre processus serait de regrouper
l'appel à la fonction tempnam() et l'ouverture du fichier
dans une construction identifiant une section critique. Expliquez
pourquoi cette solution n'est cependant pas
envisageable.