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
- Si O_CREAT est défini et que le fichier n'existait pas auparavant, la fonction open() doit complété avec succès pour mettre à jour les champs st_atime, st_ctime et st_mtime du fichier et les champs st_ctime et st_mtime du répertoire parent.
- Si O_TRUNC est défini et que le fichier existait précédemment, open() à mettre à jour les champs st_ctime et st_mtime du fichier.
- Si les indicateurs O_SYNC et O_DSYNC sont tous deux définis, le résultat sera que seul l'indicateur O_SYNC sera prise en compte.
- Si le paramètre path fait référence à un fichier de flux de données, le paramètres oflag peut être construit à partir de O_NONBLOCK avec O_RDONLY, O_WRONLY ou O_RDWR. Les autres valeurs d'indicateur ne sont pas applicables aux périphériques de flux de données et n'ont aucun effet sur celles-ci. La valeur O_NONBLOCK affecte le fonctionnement des pilotes de flux de données et certaines fonctions appliquées aux descripteurs de fichiers associés aux fichiers de flux de données. Pour les pilotes de flux de données, l'intégration de O_NONBLOCK est spécifique au périphérique.
- Si le nom du paramètre path indique le côté maître d'un périphérique pseudo-terminal, il n'est pas spécifié dans la documentation si la fonction open() verrouille le côté esclave afin qu'il ne puisse pas être ouvert, par conséquent, les applications conformes doivent appeler la fonction unlockpt() avant d'ouvrir le côté esclave.
- La plus grande valeur pouvant être représentée correctement dans un objet de type off_t doit être établie en tant que maximum de déplacement dans la description du fichier ouverte.
- Vous pouvez utiliser la commande Linux suivante «ulimit -a» pour connaître le nombre maximum de fichiers ouvert simultanément et la commande «cat /proc/sys/fs/file-max» pour connaître le nombre maximum de fichiers pouvant être ouvert par le système d'exploitation.
Exemples
L'exemple suivant permet de créer le fichier «.htaccess» dans l'emplacement courant :
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- void main() {
- int Handle;
- if ((Handle = open(".htaccess", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
- perror("Impossible de créer le fichier\n");
- exit(1);
- } else {
- puts("Traitement...");
- close(Handle);
- puts("FIN");
- }
- }
L'exemple suivant permet de lire le fichier «.htaccess» existant dans l'emplacement courant :
L'exemple suivant permet d'ouvrir le même un certain nombre de fois :
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- #define MAX_FILES 10000
-
- void main() {
- int Handle[MAX_FILES];
- int I;
- puts("OUVRE LE FICHIER UN CERTAIN NOMBRE DE FOIS...");
- for(I = 1;I < MAX_FILES; I++) {
- if ((Handle[I] = open(".htaccess", O_RDONLY)) == -1) {
- printf("Tentative %i d'ouverture de fichier\n",I);
- exit(1);
- }
- }
- puts("FERME LES FICHIERS...");
- for(I = 1;I < MAX_FILES; I++) {
- close(Handle[I]);
- }
- puts("FIN");
- }
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