Section courante

A propos

Section administrative du site

OPEN

Ouvre
  sys/stat.h
fcntl.h

Syntaxe

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

Paramètres

Nom Description
pathname Ce paramètre permet d'indiquer le nom du fichier.
oflag Ce paramètre permet d'indiquer le drapeau de mode d'ouverture (les constantes peuvent être combiné avec un caractère «|» sauf pour O_RDONLY, O_WRONLY et O_RDWR) :
Constante Description
O_RDONLY Cette constante permet d'indiquer qu'il faut ouvrir le fichier en mode lecture seulement.
O_WRONLY Cette constante permet d'indiquer qu'il faut ouvrir le fichier en mode écriture seulement.
O_RDWR Cette constante permet d'indiquer qu'il faut ouvrir le fichier en mode lecture et écriture.
O_APPEND Cette constante permet d'indiquer que le déplacement du fichier doit être défini à la fin du fichier avant chaque écriture.
O_CREAT Cette constante permet de créer le fichier.
O_DSYNC Cette constante permet d'indiquer que les opérations d'entrée/sortie d'écriture dans le descripteur de fichier doivent se terminer comme défini par l'achèvement de l'intégrité des données d'entrée/sortie synchronisées.
O_EXCL Cette constante permet d'indiquer que si le fichier existe, il ne peut pas être créé et qu'il doit retourner un erreur dans errno.
O_NOCTTY Cette constante permet d'indiquer que si l'ensemble et le chemin de fichier identifient un terminal, la fonction open() ne doit pas faire en sorte que le terminal devienne le terminal de contrôle du processus.
O_NONBLOCK Cette constante permet d'indiquer que s'il est en mode lecture qu'il doit retourné sans délai et si elle est écriture, il doit bloquer le processus léger appelant jusqu'à ce qu'un processus léger ouvre le fichier en écriture.
O_RSYNC Cette constante permet d'indiquer que les opérations d'entrée/sortie de lecture sur le descripteur de fichier doivent se terminer au même niveau d'intégrité que celui spécifié par les drapeaux O_DSYNC et O_SYNC.
O_SYNC Cette constante permet d'indiquer que les opérations d'entrée/sortie en écriture sur le descripteur de fichier doivent se terminer comme défini par l'achèvement de l'intégrité du fichier d'entrée/sortie synchronisé.
O_TRUNC Cette constante permet d'indiquer que le fichier doit avoir la taille de 0 octets et donc que les données sont effacé s'il existe et a été ouvert avec succès par O_RDWR ou O_WRONLY.
O_CLOEXEC Cette constante permet d'activer le drapeau close-on-exec pour le nouveau descripteur de fichier. Cette constante est disponible à partir du noyau Linux 2.6.23.
mode Ce paramètre permet d'indiquer les permissions :
Constante Valeur Description
S_IRWXU 00700 Cette valeur permet d'indiquer que l'utilisateur a la permission en lecture, écriture et d'exécution.
S_IRUSR 00400 Cette valeur permet d'indiquer que l'utilisateur a la permission en lecture.
S_IWUSR 00200 Cette valeur permet d'indiquer que l'utilisateur a la permission en écriture.
S_IXUSR 00100 Cette valeur permet d'indiquer que l'utilisateur a la permission en exécution.
S_IRWXG 00070 Cette valeur permet d'indiquer que le groupe a la permission en lecture, écriture et exécution.
S_IRGRP 00040 Cette valeur permet d'indiquer que le groupe a la permission en lecture.
S_IRGRP 00020 Cette valeur permet d'indiquer que le groupe a la permission en écriture.
S_IXGRP 00010 Cette valeur permet d'indiquer que le groupe a la permission en exécution.
S_IRWXO 00007 Cette valeur permet d'indiquer que tous ont la permission en lecture, écriture et d'exécution.
S_IROTH 00004 Cette valeur permet d'indiquer que tous ont la permission en lecture.
S_IWOTH 00002 Cette valeur permet d'indiquer que tous ont la permission en écriture.
S_IXOTH 00001 Cette valeur permet d'indiquer que tous ont la permission en exécution.

Retour

Valeur Description
-1 Cette valeur permet d'indiquer qu'une erreur s'est produite et la variable «errno» contiendra l'erreur.
valeur entière != -1 Ces valeurs permettent d'indiquer qu'un descripteur pour le socket est accepté.

Description

Cette fonction permet d'effectuer l'ouverture d'un fichier en lecture et écriture.

Algorithme

MODULE open(path, flags, mode)
   * Vérifier que le chemin est valide
   SI path est NULL ou vide ALORS
      RETOURNE -1      * Erreur : chemin invalide
   FIN SI

   * Vérifier que les drapeaux contiennent au moins un des modes valides (lecture, écriture,...)
   SI flags ne contient ni O_RDONLY, O_WRONLY, ni O_RDWR ALORS
      RETOURNE -1      * Erreur : mode d'ouverture invalide
   FIN SI

   * Cas : ouverture en lecture seule
   SI flags contient O_RDONLY ALORS
      * Vérifier si le fichier existe et peut être ouvert en lecture
      Ouvrir le fichier en mode lecture
      SI le fichier n'existe pas ou ne peut pas être ouvert ALORS
         RETOURNE -1      * Erreur : fichier introuvable ou inaccessible
      FIN SI
   FIN SI

   * Cas : ouverture en écriture seule
   SI flags contient O_WRONLY ALORS
      * Vérifier si le fichier peut être ouvert en écriture
      Ouvrir le fichier en mode écriture
      SI le fichier est protégé en écriture et ne peut pas être ouvert ALORS
         RETOURNE -1      * Erreur : permission d'écriture insuffisante
      FIN SI
   FIN SI

   * Cas : ouverture en lecture-écriture
   SI flags contient O_RDWR ALORS
      * Vérifier si le fichier peut être ouvert en lecture-écriture
      Ouvrir le fichier en mode lecture-écriture
      SI le fichier est protégé et ne peut pas être ouvert ALORS
         RETOURNE -1      * Erreur : permission insuffisante
      FIN SI
   FIN SI

   * Cas : création de fichier (O_CREAT) si le fichier n'existe pas
   SI flags contient O_CREAT ALORS
      SI le fichier n'existe pas ALORS
         * Créer le fichier avec les permissions spécifiées dans mode
         Créer un nouveau fichier
         SI la création échoue ALORS
            RETOURNE -1      * Erreur : échec de la création de fichier
         FIN SI
         Appliquer les permissions spécifiées dans mode
      FIN SI
   FIN SI
   * Cas : création exclusive (O_EXCL)
   SI flags contient O_EXCL ALORS
      SI le fichier existe déjà ALORS
         RETOURNE -1      * Erreur : fichier déjà existant et O_EXCL utilisé
      FIN SI
   FIN SI

   * Cas : ouverture en mode ajout (O_APPEND)
   SI flags contient O_APPEND ALORS
      Positionner le curseur à la fin du fichier avant chaque écriture
   FIN SI

   * Cas : ouverture en mode non-bloquant (O_NONBLOCK)
   SI flags contient O_NONBLOCK ALORS
      Ouvrir le fichier en mode non-bloquant
   FIN SI

   * Cas : ouverture en mode synchronisé (O_SYNC)
   SI flags contient O_SYNC ALORS
      S'assurer que toutes les écritures sont synchronisées immédiatement
   FIN SI

   * Cas : vérifier si le fichier est un répertoire et autoriser l'accès
   SI le fichier est un répertoire et le flag O_DIRECTORY n'est pas défini ALORS
      RETOURNE -1 * Erreur : tentative d'ouvrir un répertoire avec un flag inapproprié
   FIN SI

   * Si tout est correct, ouvrir le fichier et retourner le descripteur de fichier
   Retourner un descripteur de fichier (un entier identifiant le fichier ouvert)

   * Si aucune des conditions précédentes n'est remplie, signaler une erreur
   RETOURNE -1 * Erreur générale, échec de l'ouverture

Remarques

Exemples

L'exemple suivant permet de créer le fichier «.htaccess» dans l'emplacement courant :

  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. void main() {
  6.      int Handle;
  7.      if ((Handle = open(".htaccess", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
  8.           perror("Impossible de créer le fichier\n"); 
  9.           exit(1);
  10.      } else {
  11.           puts("Traitement..."); 
  12.           close(Handle);
  13.           puts("FIN"); 
  14.      }
  15. }

L'exemple suivant permet de lire le fichier «.htaccess» existant dans l'emplacement courant :

  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. void main() {
  6.      int Handle;
  7.      if ((Handle = open(".htaccess", O_RDONLY)) == -1) {
  8.           perror("Impossible d'ouvrir le fichier en lecture\n"); 
  9.           exit(1);
  10.      } else {
  11.           puts("Traitement..."); 
  12.           close(Handle);
  13.           puts("FIN"); 
  14.      }
  15. }

L'exemple suivant permet d'ouvrir le même un certain nombre de fois :

  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #define MAX_FILES 10000
  6.  
  7. void main() {
  8.      int Handle[MAX_FILES];
  9.      int I;
  10.      puts("OUVRE LE FICHIER UN CERTAIN NOMBRE DE FOIS...");
  11.      for(I = 1;I < MAX_FILES; I++) {
  12.           if ((Handle[I] = open(".htaccess", O_RDONLY)) == -1) {
  13.                printf("Tentative %i d'ouverture de fichier\n",I); 
  14.                exit(1);
  15.           }
  16.      }
  17.      puts("FERME LES FICHIERS...");
  18.      for(I = 1;I < MAX_FILES; I++) {
  19.           close(Handle[I]);
  20.      }
  21.      puts("FIN"); 
  22. }

si vous avez une limite de 1021 fichiers par processus, vous obtiendrez donc le résultat suivant :

OUVRE LE FICHIER UN CERTAIN NOMBRE DE FOIS...
Tentative 1022 d'ouverture de fichier

Voir également

Langage de programmation - Perl - Référence procédures et fonctions - open

Dernière mise à jour : Vendredi, le 6 avril 2018