Rezumat
#include << A HREF = "fișier: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "fișier: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "fișier: /usr/include/fcntl.h"> fcntl.h> int deschis (const char * calename , int flags ); int open (const char * numele căii , int flags , mode_t mode ); int creat (const char * calename, mode_t mode );Descriere
Comanda open () a sistemului de apel linux este utilizată pentru a converti un nume de cale într-un descriptor de fișier (un număr întreg mic, non-negativ pentru a fi utilizat în I / O ulterioare, ca în cazul citirii , scrierii etc.). Când apelul este reușit, descriptorul fișierului returnat va fi cel mai mic descriptor de fișier care nu este deschis în prezent pentru proces. Acest apel creează un nou fișier deschis, care nu este împărțit cu niciun alt proces. (Dar fișierele deschise partajate pot apărea prin apelul de sistem furcă (2).) Noul descriptor de fișiere este setat să rămână deschis între funcțiile exec (vezi fcntl (2)). Decalajul fișierului este setat la începutul fișierului.
Parametrii de semnalizare sunt unul dintre parametrii O_RDONLY , O_WRONLY sau O_RDWR care solicită deschiderea fișierului numai pentru citire, scriere sau citire / scriere, respectiv bit-uri sau d cu zero sau mai multe dintre următoarele:
O_CREAT
Dacă fișierul nu există, acesta va fi creat. Proprietarul (ID-ul de utilizator) al fișierului este setat la codul de utilizator eficient al procesului. Proprietatea de grup (ID-ul grupului) este setată fie la ID-ul grupului efectiv al procesului, fie la ID-ul grupului din directorul părinte (în funcție de tipul de sistem de fișiere și de opțiunile de montare și modul directorului părinte, vezi, de exemplu, opțiunile bsdgroups și sysvgroups ale sistemului de fișiere ext2, așa cum este descris în mount (8)).
O_EXCL
Când este utilizat cu O_CREAT , dacă fișierul există deja, este o eroare și deschiderea va eșua. În acest context, există o legătură simbolică, indiferent de locul în care se află. O_EXCL este rupt în sistemele de fișiere NFS , programele care se bazează pe acesta pentru efectuarea sarcinilor de blocare vor conține o condiție a cursei. Soluția pentru efectuarea blocării fișierelor atomice folosind un fișier de blocare este crearea unui fișier unic pe același fs (de exemplu, încorporând numele de gazdă și pid), folosiți linkul (2) pentru a face o legătură la fișierul de blocare. Dacă linkul () returnează 0, blocarea are succes. În caz contrar, utilizați stat (2) pe fișierul unic pentru a verifica dacă numărul de link-uri a crescut la 2, caz în care și blocarea este de succes.
O_NOCTTY
Dacă numele căii se referă la un dispozitiv terminal --- vezi tty (4) --- nu va deveni terminalul de control al procesului, chiar dacă procesul nu are unul.
O_TRUNC
Dacă fișierul există deja și este un fișier obișnuit și modul deschis permite scrierea (de exemplu, este O_RDWR sau O_WRONLY), acesta va fi trunchiat la lungimea 0. Dacă fișierul este un fișier FIFO sau dispozitiv, terminalul O_TRUNC este ignorat. În caz contrar, efectul O_TRUNC este nespecificat. (Pe multe versiuni de Linux va fi ignorată, iar în alte versiuni va reveni o eroare.)
O_APPEND
Fișierul este deschis în modul de adăugare. Înainte de fiecare scriere , pointerul fișierului este poziționat la sfârșitul fișierului, ca în cazul lseek . O_APPEND poate duce la fișiere corupte în sistemele de fișiere NFS dacă mai multe procese adaugă date simultan unui fișier. Acest lucru se datorează faptului că NFS nu acceptă adăugarea la un fișier, astfel încât nucleul clientului trebuie să îl simuleze, ceea ce nu se poate face fără o condiție de rasă.
O_NONBLOCK sau O_NDELAY
Când este posibil, fișierul este deschis în modul fără blocare. Nici operațiile deschise, nici operațiile ulterioare pe descriptorul de fișiere returnate nu vor determina să aștepte procesul de apelare. Pentru manipularea FIFO (numite conducte), a se vedea și FIFO (4). Acest mod nu trebuie să aibă niciun efect asupra altor fișiere decât FIFO.
O_SYNC
Fișierul este deschis pentru I / O sincrone. Orice scriere pe descriptorul de fișiere care rezultă va bloca procesul de apelare până când datele vor fi scrise fizic la hardware-ul de bază. Vedeți RESTRICȚII de mai jos.
O_NOFOLLOW
Dacă numele căii este o legătură simbolică, atunci deschiderea eșuează. Aceasta este o extensie FreeBSD, care a fost adăugată la Linux în versiunea 2.1.126. Legăturile simbolice din componentele anterioare ale căii vor fi totuși urmate. Anteturile de la glibc 2.0.100 și ulterior includ o definiție a acestui steag; kernel-uri înainte de 2.1.126 va ignora dacă este folosit .
O_DIRECTORY
Dacă numele căii nu este un director, provoca eșecul deschis. Acest semnalizator este specific pentru Linux și a fost adăugat în versiunea kernel 2.1.126 pentru a evita problemele de negare a serviciului dacă opendir (3) este apelat pe un dispozitiv FIFO sau pe bandă, dar nu ar trebui utilizat în afara implementării opendir .
O_DIRECT
Încercați să minimalizați efectele cache ale I / O în și din acest fișier. În general, aceasta va degrada performanța, dar este utilă în situații speciale, cum ar fi când aplicațiile își fac caching-ul propriu. Fișierul I / O se face direct în / din buffer-ele de spațiu utilizator. I / O este sincronă, adică la finalizarea apelului de sistem citit (2) sau write (2), se garantează transferul datelor. Dimensiunile de transfer și alinierea bufferului utilizator și a offsetului fișierelor trebuie să fie multiplii ai dimensiunii blocului logic al sistemului de fișiere.
Acest steguleț este susținut pe un număr de sisteme asemănătoare Unix; suportul a fost adăugat sub Linux în kernel version 2.4.10.
O interfață similară semantic pentru dispozitive bloc este descrisă în materia primă (8).
O_ASYNC
Generați un semnal (în mod implicit SIGIO, dar acest lucru poate fi modificat prin fcntl (2)) atunci când intrarea sau ieșirea devin posibile pe acest descriptor de fișier. Această caracteristică este disponibilă numai pentru terminale, pseudo-terminale și prize. Consultați fcntl (2) pentru detalii suplimentare.
O_LARGEFILE
La sistemele pe 32 de biți care acceptă sistemul de fișiere mari, permiteți deschiderea fișierelor a căror dimensiune nu poate fi reprezentată în 31 de biți.
Unele dintre aceste steaguri opționale pot fi modificate utilizând fcntl după deschiderea fișierului.
Modul de argumentare specifică permisiunile de utilizare în cazul creării unui nou fișier. Acesta este modificat de umask- ul procesului în mod obișnuit: permisiunile fișierului creat sunt (mode & ~ umask) . Rețineți că acest mod se aplică numai accesărilor viitoare ale fișierului nou creat; apelul deschis care creează un fișier numai pentru citire poate întoarce un descriptor de fișier de citire / scriere.
Următoarele constante simbolice sunt furnizate pentru modul :
S_IRWXU
00700 utilizatorul (proprietarul fișierului) a citit, a scrie și a executa permisiunea
S_IRUSR (S_IREAD)
00400 utilizatorul are permisiunea de citire
S_IWUSR (S_IWRITE)
00200 utilizatorul are permisiunea de scriere
S_IXUSR (S_IEXEC)
Utilizatorul are permisiunea de executare
S_IRWXG
Grupul 00070 a citit, a scris și a executa permisiunea
S_IRGRP
Grupul 00040 a permis permisiunea de citire
S_IWGRP
Grupul 00020 are permisiunea de scriere
S_IXGRP
Grupul 00010 are permisiunea de executare
S_IRWXO
00007 alții au citit, au scris și au executat permisiunea
S_IROTH
00004 alții au permisiunea de citire
S_IWOTH
00002 alții au permisiunea de scriere
S_IXOTH
00001 alții au permisiune de execuție
trebuie să fie specificat când O_CREAT este în steaguri și este ignorat altfel.
creat este echivalent cu deschiderea cu steaguri egale cu O_CREAT | O_WRONLY | O_TRUNC .
VALOARE RETURNATĂ
deschideți și creați returnează noul descriptor de fișiere sau -1 dacă a apărut o eroare (în acest caz, errno este setat corespunzător). Rețineți că fișierele deschise pot deschide fișierele speciale ale dispozitivului, dar creat-ul nu le poate crea - utilizați în schimb mknod (2).
Pe sistemele de fișiere NFS cu mapare UID activată, poate fi deschis un descriptor de fișier, dar, de exemplu, cererile de citire (2) sunt respinse cu EACCES . Acest lucru se datorează faptului că clientul funcționează deschis, verificând permisiunile, dar maparea UID este efectuată de server după solicitările de citire și scriere.
Dacă fișierul este nou creat, câmpurile atime, ctime, mtime sunt setate la ora curentă, la fel și câmpurile ctime și mtime ale directorului părinte. Altfel, dacă fișierul este modificat din cauza semnalizatorului O_TRUNC, câmpurile lui ctime și mtime sunt setate la ora curentă.
Erori
EEXIST
numele căii există deja și s-au folosit O_CREAT și O_EXCL .
EISDIR
numele căii se referă la un director și accesul solicitat implică scrierea (care este, O_WRONLY sau O_RDWR este setat).
EACCES
Accesul solicitat la fișier nu este permis sau unul dintre directoarele din cale nu permite permisiunea de căutare (executare) sau fișierul nu există încă și nu este permisă scrierea accesului la directorul părinte.
ENAMETOOLONG
numele traseului a fost prea lung.
ENOENT
O_CREAT nu este setat și fișierul numit nu există. Sau, o componentă de director în nume de cale nu există sau este o legătură simbolică încurcată.
ENOTDIR
O componentă folosită ca un director în numele de cale nu este, de fapt, un director sau O_DIRECTORY a fost specificată și numele căii nu a fost un director.
ENXIO
O_NONBLOCK | O_WRONLY este setat, fișierul numit este un FIFO și nici un proces nu are fișierul deschis pentru citire. Sau, fișierul este un fișier special al dispozitivului și nu există un dispozitiv corespunzător.
ENODEV
numele căii se referă la un fișier special al dispozitivului și nu există niciun dispozitiv corespunzător. (Aceasta este o eroare de kernel Linux - în această situație ENXIO trebuie returnat.)
EROFS
numele căii se referă la un fișier într-un sistem de fișiere numai pentru citire și a fost solicitat accesul la scriere.
ETXTBSY
numele căii se referă la o imagine executabilă care este în curs de execuție și a fost solicitat accesul la scriere.
EFAULT
nume de căi în afara spațiului dvs. de acces accesibil.
ELOOP
Prea multe linkuri simbolice au fost întâlnite în rezolvarea căii , sau O_NOFOLLOW a fost specificată, dar numele de cale a fost o legătură simbolică.
ENOSPC
numele căsuței a fost creat, dar dispozitivul care conține numele de cale nu are loc pentru noul fișier.
ENOMEM
Memoria de kernel insuficientă a fost disponibilă.
EMFILE
Procesul are deja numărul maxim de fișiere deschise.
ENFILE
A fost atinsă limita numărului total de fișiere deschise în sistem.
În conformitate cu
SVR4, SVID, POSIX, X / OPEN, BSD 4.3 Steagurile O_NOFOLLOW și O_DIRECTORY sunt specifice Linux-ului . Este posibil să fie necesar să definiți macrocomanda _GNU_SOURCE pentru a obține definițiile acestora.
restricţii
Există multe infidelități în protocolul care stă la baza NFS, care afectează, printre altele, O_SYNC și O_NDELAY .
POSIX oferă trei variante diferite de intrări / ieșiri sincronizate, care corespund semnelor O_SYNC , O_DSYNC și O_RSYNC . În prezent (2.1.130) toate acestea sunt sinonime în Linux.