GNT sans publicité, site mobile, fonctionnalitées exclusives...

[C] Verrou exclusif sur un fichier : flock, lockf...

Le
Vincent Richard
Bonjour,

J'essaye actuellement d'empêcher l'accès, mais surtout la suppression d'un
fichier auparavant ouvert avec la fonction "open" puis verrouillé avec
"lockf" (j'ai aussi essayé "flock").

Malheureusement, ça ne fonctionne pas : on (un autre programme) peut
toujours supprimer le fichier verrouillé.

Voici le code :

int f = open("/tmp/fic", O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);

lockf(f, F_TLOCK, 0); /* ou flock(f, LOCK_EX | LOCK_NB); */

/* entre temps, le fichier peut être supprimé !!! */

lockf(f, F_ULOCK, 0);
close(f);

Je précise que les appels à "open" et "lockf" réussissent tous les 2.

Comment résoudre le problème et empêcher _vraiment_ la modification et/ou la
suppression du fichier par un autre processus ?

Merci d'avance pour vos réponses.

Vincent

--
SL> Au fait elle est mieux ma signature maintenant ?
Oui. T'enlève encore les conneries que t'as écrit dedans et c'est bon.
-+- JB in <http://www.le-gnu.net> : Le neuneuttoyage par le vide -+-
Lire la réponse

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
J. Mayer
Le #393830
On Mon, 25 Aug 2003 01:34:23 +0200, Vincent Richard wrote:

Bonjour,

Bonjour,


J'essaye actuellement d'empêcher l'accès, mais surtout la suppression d'un
fichier auparavant ouvert avec la fonction "open" puis verrouillé avec
"lockf" (j'ai aussi essayé "flock").

Malheureusement, ça ne fonctionne pas : on (un autre programme) peut
toujours supprimer le fichier verrouillé.


Je viens de sortir ma spec POSIX...
Apparement, flock ne verouille que les datas du fichier,
pas son inode.
La solution (que je ne trouve pas vraiment propre, mais bon...)
peut-être de locker l'entrée de répertoire. Ainsi, personne
ne pourra la modifier.
En gros, tu ouvre le répertoire père, tu retrouves l'entrée
correspondant à ton fichier (readdir & telldir) et tu fais
un lockf sur le répertoire uniquement pour cette entrée.
Ca fait un peu bidouille, mais ça doit marcher...

Publicité
Suivre les réponses
Poster une réponse
Anonyme