[Toulibre] Verrouiller un fichier sous Linux

Eric Noulard eric.noulard at gmail.com
Sam 22 Sep 21:47:05 CEST 2007


Le 21/09/07, Yves DUF<yves.duf at gmail.com> a écrit :
> Bonjour.
>
> Je cherche à faire quelque chose que je croyais simple :
> Écrire un petit programme en C, qui ouvre un fichier, et se le réserve
> en écriture, pendant que d'autres programmes en font la lecture.
> Mais dans le même temps je veux être certain qu'aucun autre programme
> externe quelconque ne peut pas ouvrir en écriture mon fichier, pour y
> rajouter des choses, à mon insu.




> La solution d'après ma bible de chevet "Unix Network Programming IPC"
> de W. Richard Stevens ( http://www.lavoisier.fr/notice/fr163172.html
> ), c'est d'utiliser les mandatory locks :
> - Monter le filesystem avec l'option -o mand  (ce que je fait dans un
> répertoire bidon /tmp/gha )
> - Un chmod +l sur le fichier pour rendre ce verrou obligatoire (Je ne
> l'ai pas dans mon système, donc je contourne en faisant un chmod g-x
> et g+s)
> - Un appel à fnctl pour verrouiller le fichier
> (http://pwet.fr/man/linux/appels_systemes/fcntl )

Tout ça semble être la bonne méthode qui est également résumé là:
http://www.hackinglinuxexposed.com/articles/20030623.html

Donc je pense en résumé que ta méthode fonctionne
(en tout cas ça fonctionne chez moi).
Mais en revanche il faut faire attention à ce que le père
(le main) ne ferme pas le fichier avant que son fils n'ait tenté d'y accéder.
En gros il faut que le père meurt APRES le FILS.

Sinon
1) le père ferme le fichier et PERD le lock
2) le fils écrit et se termine
3) l'ensemble des processus est terminé.

Ensuite suivant si le fils ouvre le fichier en mode bloquant
(mode par défaut) ou mode non bloquant O_NONBLOCK
l'appel à "write(2)" soit bloquera soit renverra une erreur.
Dans le cas où il bloque celà permettra au père de
fermer le fichier ce qui provoquera le déblocahe du fils etc...

Bref pour ton test je pense qu'il faut que le père fasse
un bon sleep() puis tue son fils AVANT de fermer le fichier.

Ci-joint le code modifié qui marche chez moi;

PS: je pensais qu'il y avait nécessité d'ouvrir le ficher en O_SYNC
      pour être sûr que les appels write ne soient pas bufferisés
     jusuq'au close mais celà ne semble pas nécessaire.





-- 
Erk
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: flock_test.c
Type: text/x-csrc
Taille: 1856 octets
Desc: non disponible
URL: <http://toulibre.org/pipermail/toulouse-ll/attachments/20070922/57941bf2/attachment.c>


Plus d'informations sur la liste de diffusion Toulouse-ll