Aflați deschiderea comenzii Linux

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.