2010-04-03 8 views
6

Vu le code ci-dessous (il est censé écrire "helloworld" dans un fichier "helloworld", puis lire le texte):système C appelle ouverture/lecture/écriture/fermeture et O_CREAT | O_EXCL

#include <fcntl.h> 
#include <sys/types.h> 
#include <sys/stat.h> 

#define FNAME "helloworld" 

int main(){ 
    int filedes, nbytes; 
    char buf[128]; 

    /* Creates a file */ 
    if((filedes=open(FNAME, O_CREAT | O_EXCL | O_WRONLY | O_APPEND, 
     S_IRUSR | S_IWUSR)) == -1){ 
      write(2, "Error1\n", 7); 
    } 

    /* Writes hello world to file */ 
    if(write(filedes, FNAME, 10) != 10) 
     write(2, "Error2\n", 7); 

    /* Close file */ 
    close(filedes); 

    if((filedes = open(FNAME, O_RDONLY))==-1) 
     write(2, "Error3\n", 7); 

    /* Prints file contents on screen */  
    if((nbytes=read(filedes, buf, 128)) == -1) 
     write(2, "Error4\n", 7); 

    if(write(1, buf, nbytes) != nbytes) 
     write(2, "Error5\n", 7); 

    /* Close file after read */ 
    close(filedes); 

    return (0); 
} 

la première fois que je lance le programme, la sortie est:

helloworld 

Après que chaque fois que je pour exécuter le programme, la sortie est:

Error1 
Error2 
helloworld 

Je ne comprends pas pourquoi le texte n'est pas ajouté, car j'ai spécifié le fichier O_APPEND. Est-ce parce que j'ai inclus O_CREAT? Si le fichier est déjà créé, O_CREAT ne devrait-il pas être ignoré?

Répondre

11

O_EXCL force la création du fichier. Si le fichier existe déjà, l'appel échoue.

Il est utilisé pour s'assurer que le fichier doit être créé, avec les autorisations données passées dans le troisième paramètre. En bref, vous avez ces options:

  • O_CREAT: Créez le fichier avec les autorisations données si le fichier n'existe pas déjà. Si le fichier existe, il est ouvert et les autorisations sont ignorées.
  • O_CREAT | O_EXCL: Créez le fichier avec les autorisations données si le fichier n'existe pas déjà. Si le fichier existe, il échoue. Ceci est utile pour créer des fichiers de verrouillage et garantir un accès exclusif au fichier (à condition que tous les programmes qui utilisent ce fichier suivent le même protocole).
  • O_CREAT | O_TRUNC: Créez le fichier avec les autorisations données si le fichier n'existe pas déjà. Sinon, tronquez le fichier à zéro octet. Cela a plus d'effet que nous attendons quand nous pensons "créer un nouveau fichier vide". Pourtant, il conserve les autorisations déjà présentes dans le fichier existant.

Plus d'informations à partir the manual page:

O_EXCL

Utilisé avec O_CREAT, si le fichier existe déjà, il est une erreur et l'open() échouera. Dans ce contexte, un lien symbolique existe, indépendamment de où il pointe. O_EXCL est rompu sur les systèmes de fichiers NFS; programmes qui s'appuyer sur elle pour effectuer des tâches de verrouillage contiendra une condition de concurrence. La solution pour effectuer le verrouillage atomique du fichier en utilisant un fichier de verrouillage est à créer un fichier unique sur le même fichier système (par exemple, le nom d'hôte incorporant et pid), la liaison de l'utilisation (2) pour faire un lien au lockfile. Si link() renvoie 0, , le verrou est réussi. Sinon, utilisez stat (2) sur le fichier unique pour vérifier si son nombre de liens a augmenté à 2, en auquel cas le verrou est également réussi.

+0

Merci, en supprimant O_EXCL le code est fonctionnel. Pouvez-vous s'il vous plaît m'expliquer l'utilisation de O_EXCL. –