Remonter Suivant

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.


Remonter Suivant