Synopsis
#comprendre
La description
leouvrir() La commande linux d’appel système permet de convertir un chemin en un descripteur de fichier (un petit entier non négatif à utiliser dans les E / S suivantes, comme avec lis, écrire, etc.). Lorsque l'appel aboutit, le descripteur de fichier renvoyé est le descripteur de fichier le plus bas non ouvert pour le processus. Cet appel crée un nouveau fichier ouvert, qui n'est partagé avec aucun autre processus. (Mais des fichiers ouverts partagés peuvent survenir via lefourchette(2) appel système.) Le nouveau descripteur de fichier doit rester ouvert pour toutes les fonctions d’exec (voirfcntl(2)). Le décalage de fichier est défini au début du fichier.
Le paramètre drapeaux fait partie deO_RDONLY, O_WRONLY ouO_RDWR qui demande d’ouvrir le fichier en lecture seule, en écriture seule ou en lecture / écriture, respectivement, au niveau du bit. ou 'avec zéro ou plus de ce qui suit:
O_CREAT
Si le fichier n'existe pas, il sera créé. Le propriétaire (ID utilisateur) du fichier est défini sur l'ID utilisateur effectif du processus. La propriété du groupe (ID de groupe) est définie sur l'ID de groupe effectif du processus ou sur l'ID de groupe du répertoire parent (en fonction du type de système de fichiers et des options de montage, ainsi que du mode du répertoire parent, voir, par exemple, le montage. options bsdgroups et sysvgroups du système de fichiers ext2, comme décrit dansmonter(8)).
O_EXCL
Lorsqu'il est utilisé avecO_CREAT, si le fichier existe déjà, il s’agit d’une erreur et leouvrir va échouer. Dans ce contexte, un lien symbolique existe, quel que soit le point sur lequel il pointe.O_EXCL est brisé sur les systèmes de fichiers NFS, les programmes qui l’utilisent pour effectuer des tâches de verrouillage contiendront une condition de concurrence critique. La solution pour effectuer le verrouillage de fichier atomique à l'aide d'un fichier lockfile consiste à créer un fichier unique sur le même fs (par exemple, en incorporant les noms d'hôte et pid). Utilisez link (2) pour créer un lien vers le fichier lockfile. Silien() renvoie 0, le verrouillage est réussi. Sinon, utilisez stat(2) sur le fichier unique pour vérifier si le nombre de liens est passé à 2, auquel cas le verrouillage a également abouti.
O_NOCTTY
Si chemin d'accès fait référence à un terminal --- voirtty(4) --- il ne deviendra pas le terminal de contrôle du processus même si le processus n'en a pas.
O_TRUNC
Si le fichier existe déjà et est un fichier normal et que le mode ouvert autorise l'écriture (c'est-à-dire O_RDWR ou O_WRONLY), il sera tronqué à la longueur 0. Si le fichier est un fichier FIFO ou de périphérique terminal, l'indicateur O_TRUNC est ignoré. Sinon, l'effet de O_TRUNC n'est pas spécifié. (Sur de nombreuses versions de Linux, il sera ignoré. Sur d'autres versions, une erreur sera renvoyée.)
O_APPEND
Le fichier est ouvert en mode ajout. Avant chaqueécrire, le pointeur de fichier est positionné à la fin du fichier, comme aveclseek. O_APPEND peut conduire à la corruption des fichiers sur les systèmes de fichiers NFS si plusieurs processus ajoutent des données à un fichier à la fois. Cela est dû au fait que NFS ne prend pas en charge l’ajout à un fichier. Le noyau du client doit donc le simuler, ce qui ne peut pas être fait sans une condition de concurrence.
O_NONBLOCK ouO_NDELAY
Si possible, le fichier est ouvert en mode non bloquant. Ni leouvrir ni aucune opération ultérieure sur le descripteur de fichier renvoyé ne fera attendre le processus appelant. Pour le traitement des FIFO (tubes nommés), voir aussififo(4). Ce mode n'a pas besoin d'avoir d'effet sur les fichiers autres que les FIFO.
O_SYNC
Le fichier est ouvert pour les E / S synchrones. Toutécrires sur le descripteur de fichier résultant bloque le processus appelant jusqu'à ce que les données aient été physiquement écrites sur le matériel sous-jacent. Voir les restrictions ci-dessous, cependant.
O_NOFOLLOW
Si chemin d'accès est un lien symbolique, l'ouverture échoue. Il s’agit d’une extension FreeBSD ajoutée à Linux dans la version 2.1.126. Les liens symboliques dans les composants précédents du chemin seront toujours suivis. Les en-têtes de la glibc 2.0.100 et des versions ultérieures incluent une définition de ce drapeau; les noyaux antérieurs à 2.1.126 l'ignoreront s'ils sont utilisés .
O_DIRECTORY
Si chemin d'accès n’est pas un répertoire, l’ouverture échoue. Cet indicateur est spécifique à Linux et a été ajouté à la version 2.1.126 du noyau pour éviter les problèmes de déni de service siopendir(3) est appelé sur un périphérique FIFO ou sur bande, mais ne doit pas être utilisé en dehors de la mise en œuvre deopendir.
O_DIRECT
Essayez de minimiser les effets de cache des E / S vers et depuis ce fichier. En général, cela dégrade les performances, mais cela s'avère utile dans des situations spéciales, par exemple lorsque les applications font leur propre mise en cache. Les entrées / sorties de fichiers sont effectuées directement vers / depuis les tampons d'espace utilisateur. L’entrée / sortie est synchrone, c’est-à-dire à la fin de la lis(2) ouécrire(2) appel système, il est garanti que les données ont été transférées. Les tailles de transfert et l'alignement du tampon utilisateur et du décalage de fichier doivent tous être des multiples de la taille de bloc logique du système de fichiers.Cet indicateur est pris en charge sur un certain nombre de systèmes de type Unix. le support a été ajouté sous Linux dans la version 2.4.10 du noyau.Une interface sémantiquement similaire pour les périphériques en mode bloc est décrite dansbrut(8). O_ASYNC Générer un signal (SIGIO par défaut, mais cela peut être modifié viafcntl(2)) lorsque l'entrée ou la sortie devient possible sur ce descripteur de fichier. Cette fonctionnalité est uniquement disponible pour les terminaux, les pseudo-terminaux et les sockets. Voirfcntl(2) pour plus de détails. O_LARGEFILE Sur les systèmes 32 bits prenant en charge le système de fichiers volumineux, autorisez l’ouverture de fichiers dont la taille ne peut pas être représentée en 31 bits. Certains de ces drapeaux facultatifs peuvent être modifiés en utilisantfcntl après l'ouverture du fichier. L'argument mode spécifie les autorisations à utiliser dans le cas où un nouveau fichier est créé. Il est modifié par le processusumask de la manière habituelle: les permissions du fichier créé sont(mode & ~ umask). Notez que ce mode ne s'applique qu'aux futurs accès au fichier nouvellement créé. laouvrirUn appel qui crée un fichier en lecture seule peut très bien renvoyer un descripteur de fichier en lecture / écriture. Les constantes symboliques suivantes sont fournies pour mode : S_IRWXU 00700 utilisateur (propriétaire du fichier) a les droits de lecture, d'écriture et d'exécution S_IRUSR (S_IREAD) 00400 utilisateur a la permission de lire S_IWUSR (S_IWRITE) 00200 utilisateur a le droit d'écriture S_IXUSR (S_IEXEC) 00100 utilisateur a la permission d'exécution S_IRWXG Le groupe 00070 dispose des autorisations de lecture, d'écriture et d'exécution S_IRGRP 00040 le groupe a l'autorisation de lecture S_IWGRP 00020 le groupe a l'autorisation d'écriture S_IXGRP Le groupe 00010 dispose d'une autorisation d'exécution S_IRWXO 00007 autres personnes ont les droits de lecture, d'écriture et d'exécution S_IROTH 00004 autres personnes ont la permission de lire S_IWOTH 00002 autres personnes ont le droit d'écriture S_IXOTH 00001 d'autres ont l'autorisation d'exécuter mode doit être spécifié quandO_CREAT est dans le drapeaux et est ignoré sinon. cré est équivalent àouvrir avec drapeaux égal àO_CREAT | O_WRONLY | O_TRUNC. Valeur de retour ouvrir etcré renvoyer le nouveau descripteur de fichier, ou -1 en cas d'erreur (dans ce cas, errno est réglé correctement). Notez queouvrir peut ouvrir des fichiers spéciaux de périphérique, maiscré ne peut pas les créer - utiliserMknod(2) à la place. Sur les systèmes de fichiers NFS avec le mappage UID activé,ouvrir peut renvoyer un descripteur de fichier mais par ex. lis(2) les demandes sont refusées avecEACCES. C’est parce que le client effectueouvrir en vérifiant les autorisations, mais le mappage UID est effectué par le serveur lors de demandes de lecture et d’écriture. Si le fichier vient d'être créé, ses champs atime, ctime, mtime sont définis sur l'heure actuelle, de même que les champs ctime et mtime du répertoire parent. Sinon, si le fichier est modifié en raison de l'indicateur O_TRUNC, ses champs ctime et mtime sont définis sur l'heure actuelle. EEXIST chemin d'accès existe déjà etO_CREAT etO_EXCL ont été utilisées. EISDIR chemin d'accès fait référence à un répertoire et l'accès demandé a impliqué une écriture (c'est-à-dire,O_WRONLY ouO_RDWR est réglé). EACCES L’accès demandé au fichier n’est pas autorisé, ou l’un des répertoires de chemin d'accès n'autorisait pas l'autorisation de recherche (exécution) ou le fichier n'existait pas encore et l'accès en écriture au répertoire parent n'était pas autorisé. ENAMETOOLONG chemin d'accès était trop long. ENOENT O_CREAT n'est pas défini et le fichier nommé n'existe pas. Ou, un composant de répertoire dans chemin d'accès n'existe pas ou est un lien symbolique pendant. ENOTDIR Un composant utilisé comme répertoire dans chemin d'accès n'est pas, en fait, un répertoire, ouO_DIRECTORYa été précisé et chemin d'accès n'était pas un répertoire. ENXIO O_NONBLOCK | O_WRONLY est défini, le fichier nommé est une FIFO et aucun processus n’a ouvert le fichier en lecture. Ou bien, le fichier est un fichier spécial de périphérique et aucun périphérique correspondant n'existe. ENODEV chemin d'accès fait référence à un fichier spécial de périphérique et aucun périphérique correspondant n'existe. (Il s'agit d'un bogue du noyau Linux. Dans cette situation, ENXIO doit être renvoyé.) EROFS chemin d'accès fait référence à un fichier sur un système de fichiers en lecture seule et un accès en écriture a été demandé. ETXTBSY chemin d'accès fait référence à une image exécutable en cours d'exécution et un accès en écriture a été demandé. EFAULT chemin d'accès points en dehors de votre espace d'adressage accessible. ELOOP Trop de liens symboliques ont été rencontrés dans la résolution chemin d'accès , ouO_NOFOLLOW a été précisé mais chemin d'accès était un lien symbolique. ENOSPC chemin d'accès devait être créé, mais le dispositif contenant chemin d'accès n'a pas de place pour le nouveau fichier. ENOMEM La mémoire du noyau était insuffisante. EMFILE Le processus a déjà le nombre maximal de fichiers ouverts. ENFILE La limite du nombre total de fichiers ouverts sur le système a été atteinte. SVr4, SVID, POSIX, X / OPEN, BSD 4.3 LeO_NOFOLLOW etO_DIRECTORY les drapeaux sont spécifiques à Linux. On peut avoir à définir le_GNU_SOURCE macro pour obtenir leurs définitions. Il existe de nombreuses faiblesses dans le protocole sous-jacent à NFS, affectant entre autresO_SYNC etO_NDELAY. POSIX propose trois variantes différentes d’E / S synchronisées, correspondant aux drapeauxO_SYNC , O_DSYNC et O_RSYNC. Actuellement (2.1.130), ils sont tous synonymes sous Linux. les erreurs
Se conformer à
Restrictions