Forum Programmation.c Locker un fichier

Posté par  .
Étiquettes : aucune
0
6
juin
2008
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  (site web personnel) . Évalué à 1.

    La pose d'un verrou sur un fichier se fait à l'aide de la fonction système fcntl().

    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  . Évalué à 1.

      Merci de ta réponse, mais malheureusement cela n'a pas d'effet ni en lecture ni en ecriture :


      [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  . Évalué à 2.

        Hum une solution dégeuuuuulassse (oui j'ai l'accent) serait de renomer le fichier. Ceci dans l'éventualité ou tu cherche à faire une bidouille.
      • [^] # Mandatory locks

        Posté par  . Évalué à 3.

        Voir aussi man 2 flock et man mount pour plus d'infos sur les mandatory locks. Par défaut, les verrous sont consultatifs. Il faut monter son système de fichiers avec l'option mand pour les rendre obligatoires.
      • [^] # Re: fcntl

        Posté par  . É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  . Évalué à 2.

        Jusqu'à preuve du contraire, ton 'cat' effectue une lecture. Il est donc logique que ça fonctionne :-)

        Fais plutôt "echo toto > foo.bar"
  • # fcntl

    Posté par  . Évalué à 1.

    Bonjour,


    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  . Évalué à 2.

      As-tu essayé de monter ton système de fichiers avec les mandatory locks, comme expliqué plus haut ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.