Bonjour,
Je souhaiterais savoir si il été possible :
- le programme 'a' lock le fichier 'f'
- un autre programme 'b' tente d'ecrire dans 'f'
- l'ecriture dans 'f' est interdite.
Existe-il une commande Linux ou une fonction C qui pourais faire l'affaire ?
Sachant que je ne souhaite pas passer par les droits classiques ; chmod.
Je cherches juste un moyen de locker exclusivement un fichier.
Merci d'avance
# fcntl
Posté par Meku (site web personnel) . Évalué à 1.
Un exemple que j'ai là, sous la main :
struct flock verrou;
int fd;
int no_err;
/* création d'un verrou en lecture sur tout le fichier de données */
verrou.l_type = F_RDLCK;
verrou.l_start = 0;
verrou.l_len = 0;
verrou.l_whence = SEEK_SET;
verrou.l_pid = getpid();
/* ouverture du fichier de données */
fd = open ("data.txt", O_RDONLY);
/* pose du verrou */
fcntl (fd, F_SETLKW, &verrou);
/* affichage des données */
lit_et_affiche_donnees (fd);
/* deverouillage et fermeture */
verrou.l_type = F_UNLCK;
fcntl (fd, F_SETLKW, &verrou);
close (fd);
Réfère toi à la page man pour tous les détails et les options possibles (verrous en lecture/écriture, etc).
[^] # Re: fcntl
Posté par yatt . Évalué à 1.
[yatt@localhost l]$ echo test > foo.bar
[yatt@localhost l]$ nohup ./main &
[1] 24352
nohup: ignoring input and appending output to `nohup.out'
[yatt@localhost l]$ cat foo.bar
test
[yatt@localhost l]$ cat foo.bar
test
[^] # Re: fcntl
Posté par Jean B . Évalué à 2.
[^] # Mandatory locks
Posté par Obsidian . Évalué à 3.
[^] # Re: Mandatory locks
Posté par Mildred (site web personnel) . Évalué à 3.
[^] # Re: fcntl
Posté par fcartegnie . Évalué à 4.
[yatt@localhost l]$ echo test > foo.bar
[yatt@localhost l]$ nohup ./main &
[1] 24352
nohup: ignoring input and appending output to `nohup.out'
[yatt@localhost l]$ cat foo.bar
test
[yatt@localhost l]$ cat foo.bar
test
Sauf que là ton lock fonctionne !
Tu fais une lecture du fichier avec cat, pas une écriture. Forcément, si tu met un lock en écriture uniquement, il va autoriser à lire...
[^] # Re: fcntl
Posté par Kerro . Évalué à 2.
Fais plutôt "echo toto > foo.bar"
# fcntl
Posté par yatt . Évalué à 1.
Merci beaucoups de vos réponses, mais en partant du code citer plus haut, voici ce que ça donne reelement (je precise que j'ai mis un sleep(10) aprés fcntl()) :
[yatt@localhost l]$ gcc lock.c -o lock
[yatt@localhost l]$ echo foo > foo.bar
[yatt@localhost l]$ cat foo.bar
foo
[yatt@localhost l]$ ./lock &
[1] 5475
[yatt@localhost l]$ echo bar > foo.bar
[yatt@localhost l]$ cat foo.bar
bar
[yatt@localhost l]$ cat foo.bar
bar
[1]+ Done ./lock
[yatt@localhost l]$ cat foo.bar
bar
Le fichier foo.bar est un fichier "régulier" sans droits particuliers.
Pouvez-vous m'aidez ?
Merci d'avance.
[^] # Re: fcntl
Posté par Obsidian . Évalué à 2.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.