Skip to main content

Deschideți comanda Linux și comandă Unix

Linux Tutorial for Beginners: Introduction to Linux Operating System (Iunie 2026)

Linux Tutorial for Beginners: Introduction to Linux Operating System (Iunie 2026)
Anonim

Rezumat

#include #include #include int deschis (const char * caii de acces , int steaguri ); int deschis (const char * caii de acces , int steaguri , mode_t mod ); int creat (const char * caii de acces , mode_t mod );

Descriere

deschis() comanda linux de apel sistem este folosită pentru a converti un nume de cale într-un descriptor de fișier (un număr întreg mic, non-negativ pentru utilizarea în I / O ulterioare ca și cu citit, scrie, 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 prinfurculiţă(2) apel sistem.) Noul descriptor de fișiere este setat să rămână deschis între funcțiile exec (vezifcntl(2)). Decalajul fișierului este setat la începutul fișierului.

Parametrul steaguri este unul dinO_RDONLY, O_WRONLY sauO_RDWR care solicită deschiderea fișierului doar pentru citire, scriere sau citire / scriere, respectiv, 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țiuni bsdgroups și sysvgroups a sistemului de fișiere ext2, așa cum este descris înmontură(8)).

O_EXCL

Când este folosit cuO_CREAT, dacă fișierul există deja, este o eroare șideschis 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 aceasta pentru executarea sarcinilor de blocare vor conține o condiție a cursei. Soluția pentru efectuarea blocării fișierelor atomice utilizând un fișier de blocare este să creați un fișier unic pe același fs (de ex., Încorporând numele de gazdă și pid), utilizați linkul (2) pentru a crea o legătură la fișierul de blocare. Dacălegătură() returnează 0, blocarea are succes. În caz contrar, utilizați Stat(2) pe fișierul unic pentru a verifica dacă numărul de linkuri a crescut la 2, caz în care și blocarea este de succes.

O_NOCTTY

Dacă caii de acces se referă la un dispozitiv terminal --- vezitty(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 (adică 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 fiecarescrie, pointerul fișierului este poziționat la sfârșitul fișierului, ca și când culseek. O_APPEND poate duce la deteriorarea fișierelor pe sistemele de fișiere NFS dacă mai multe procese adaugă date la un fișier simultan. 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 sauIN INTARZIERE

Când este posibil, fișierul este deschis în modul fără blocare. Nicideschis nici o operație ulterioară a descriptorului de fișier care este returnată va determina să aștepte procesul de apelare. Pentru manipularea FIFO (conducte numite), a se vedea, de asemeneafifo(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. Oricescries 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ă caii de acces 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ă caii de acces nu este un director, cauza deschiderea de eșec. Acest steag 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 trebuie utilizat în afara implementăriiopendir.

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 procesului citit(2) sauscrie(2) apel sistem, datele sunt garantate că au fost transferate. 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ă înbrut(8).

O_ASYNC

Generați un semnal (SIGIO în mod implicit, dar acest lucru poate fi modificat prin intermediulfcntl(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. Vedeafcntl(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ândfcntl după ce fișierul a fost deschis.

Argumentul mod specifică permisiunile de utilizare în cazul creării unui nou fișier. Acesta este modificat de procesumask în modul obișnuit: permisiunile fișierului creat sunt(modul & ~ umask). Rețineți că acest mod se aplică numai accesărilor viitoare ale fișierului nou creat;deschisapelul care creează un fișier numai pentru citire poate întoarce un descriptor de fișier de citire / scriere.

Sunt prevăzute următoarele constante simbolice mod :

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

mod trebuie specificat cândO_CREAT este in steaguri , și este ignorat altfel.

creat este echivalent cudeschis cu steaguri egal cuO_CREAT | O_WRONLY | O_TRUNC.

VALOARE RETURNATĂ

deschis șicreat returnați noul descriptor de fișier sau -1 dacă a apărut o eroare (în acest caz, errno este setat corespunzător). Rețineți cădeschis poate deschide fișiere speciale ale dispozitivului, darcreat nu le pot crea - utilizațimknod(2).

Pe sistemele de fișiere NFS cu mapare UID activată,deschis poate returna un descriptor de fișier, dar de ex. citit(2) cererile sunt respinse cuEACCES. Acest lucru se datorează faptului că clientul efectueazădeschis prin verificarea permisiunilor, 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

caii de acces există deja șiO_CREAT șiO_EXCL au fost folosite.

EISDIR

caii de acces se referă la un director și la accesul solicitat implicat în scriere (adică,O_WRONLY sauO_RDWR este setat).

EACCES

Accesul solicitat la fișier nu este permis sau unul din directoarele din caii de acces nu permite permisiunea de căutare (executare), sau fișierul nu există încă și nu este permis accesul la scriere în directorul părinte.

ENAMETOOLONG

caii de acces era prea lungă.

ENOENT

O_CREAT nu este setat și fișierul numit nu există. Sau, o componentă de director în caii de acces nu există sau nu este o legătura simbolică.

ENOTDIR

O componentă folosită ca director în caii de acces nu este, de fapt, un director, sauO_DIRECTORYa fost specificat și caii de acces nu era 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

caii de acces 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

caii de acces se referă la un fișier pe un sistem de fișiere numai pentru citire și a fost solicitat accesul la scriere.

ETXTBSY

caii de acces se referă la o imagine executabilă care este în prezent executată și a fost solicitat accesul la scriere.

EFAULT

caii de acces puncte în afara spațiului dvs. de adrese accesibil.

ELOOP

Prea multe legături simbolice au fost întâlnite în rezolvare caii de acces , sauO_NOFOLLOW a fost specificat, dar caii de acces era o legătură simbolică.

ENOSPC

caii de acces urma să fie creată, dar dispozitivul care conținea caii de acces nu are loc pentru noul dosar.

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.3O_NOFOLLOW șiO_DIRECTORY steagurile sunt specifice Linux-ului. Este posibil să fie necesar să se definească_GNU_SOURCE macro pentru a obține definițiile acestora.

restricţii

Există multe infidelități în protocolul care stă la baza SNF, care afectează, printre alteleO_SYNC șiIN INTARZIERE.

POSIX oferă trei variante diferite de intrări / ieșiri sincronizate, corespunzătoare steagurilorO_SYNC , O_DSYNC și O_RSYNC. În prezent (2.1.130) toate acestea sunt sinonime în Linux.