Saznajte Linux Command Open

Sinopsis

#include << A HREF = "datoteka: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "datoteka: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "datoteka: /usr/include/fcntl.h"> fcntl.h> int open (const char * pathname , int flags ); int open (const char * pathname , int flagovi, mode_t mode ); int creat (const char * pathname, mode_t mode );

Opis

Otvoreni () sistemski poziv linux naredba se koristi za pretvaranje putne datoteke u deskriptor datoteke (mali, ne-negativni cijeli broj za korištenje u narednim I / O kao što su čitanje , pisanje itd.). Kada je poziv uspješan, deskriptor datoteke se vraća sa najnižim deskriptorom datoteke koji trenutno nije otvoren za proces. Ovaj poziv kreira novu otvorenu datoteku, koja se ne deli sa bilo kojim drugim procesom. (Ali deljeni otvoreni fajlovi mogu se pojaviti preko sistemskog poziva fork (2). Novi deskriptor datoteke će ostati otvoren preko funkcija exec (pogledajte fcntl (2)). Smjena datoteke je podešena na početak datoteke.

Zastavice parametara su jedna od O_RDONLY , O_WRONLY ili O_RDWR koja zahtijeva otvaranje datoteke samo za čitanje, samo za pisanje ili čitanje / pisanje, bitno ili d sa nula ili više od sljedećeg:

O_CREAT

Ako fajl ne postoji, on će biti kreiran. Vlasnik (ID korisnika) datoteke je postavljen na efektivan korisnički ID procesa. Vlasništvo grupe (ID grupe) je postavljeno ili na efektivnu identifikacionu grupu procesa ili na identifikacionu grupu matičnog direktorijuma (u zavisnosti od tipa datotečnog sistema i opcija montaže i načina roditeljskog direktorijuma, pogledajte npr. Mount opcije bsdgroups i sysvgroups ext2 datotečnog sistema, kao što je opisano u mountu (8)).

O_EXCL

Kada se koristi sa O_CREAT-om , ako datoteka već postoji, greška je i otvoreni će propasti. U ovom kontekstu postoji simbolička veza, bez obzira na to gdje se ona ukazuje. O_EXCL je prekinut na NFS datotečnim sistemima , programi koji se oslanjaju na njega za obavljanje zadataka zaključavanja sadrže uslov trke. Rešenje za zaključavanje blokiranja atomske datoteke pomoću lockfile-a je da kreira jedinstvenu datoteku na istom fs-u (npr. Uključuje ime hosta i pid), koristeći link (2) da napravi vezu sa lockfile-om. Ako link () vraća 0, zaključavanje je uspješno. U suprotnom, koristite stat (2) na jedinstvenoj datoteci da biste proverili da li je broj povezivanja povećan na 2, u kom slučaju je brava takođe uspešna.

O_NOCTTY

Ako se ime staze odnosi na terminal uređaj --- pogledajte tty (4) --- neće postati kontrolni terminal procesa, čak i ako proces nema.

O_TRUNC

Ako datoteka već postoji i predstavlja redovnu datoteku i otvoreni režim dozvoljava pisanje (tj. Je O_RDWR ili O_WRONLY), onda će biti skraćen na dužinu 0. Ako je datoteka datoteka FIFO ili terminalnog uređaja, oznaka O_TRUNC se zanemaruje. U suprotnom, efekat O_TRUNC-a nije neodređen. (Na mnogim verzijama Linuxa to će biti zanemareno, au drugim verzijama će vratiti grešku.)

O_APPEND

Datoteka se otvara u dodirnom režimu. Prije svakog pisanja , pokazivač datoteke se nalazi na kraju datoteke, kao da je sa lseek-om . O_APPEND može dovesti do oštećenih datoteka na NFS datotečnim sistemima ako više od jednog procesa dodaju podatke u datoteku odjednom. To je zato što NFS ne podržava dodavanje datoteke, tako da klijentsko jezgro mora da simulira, što se ne može učiniti bez trkačkog stanja.

O_NONBLOCK ili O_NDELAY

Kada je moguće, datoteka se otvara u ne-blokirajućem režimu. Ni otvoreni, ni bilo kakve naknadne operacije na datoteci datoteke koji se vraća će dovesti do čekanja procesa poziva. Za rukovanje FIFO-ima (nazvanim cijevima), pogledajte i Fifo (4). Ovaj režim ne mora imati efekta na datoteke osim FIFO.

O_SYNC

Datoteka je otvorena za sinhrone I / O. Svaki zapis pisanja na rezultiranom deskriptoru datoteke blokiraće proces poziva dok podaci ne budu fizički zapisani na osnovni hardver. Ipak, pogledajte odeljak OGRANIČENJA.

O_NOFOLLOW

Ako je putanje simboličkom vezom, onda otvoren ne uspe. Ovo je proširenje FreeBSD-a, koji je dodat u Linux u verziji 2.1.126. I dalje će se pratiti simbolične veze u ranijim komponentama imena puta. Glave od glibc 2.0.100 i kasnije uključuju definiciju ove zastave; kerneli pre 2.1.126 će ga ignorisati ako se koriste .

O_DIRECTORY

Ako ime puta nije direktorijum, otvorite je da ne uspije. Ova zastavica je specifična za Linux i dodata je u verziju 2.1.126 kernela kako bi se izbjegli problemi sa poricanjem usluga ako se opendir (3) poziva na FIFO ili kasetni uređaj, ali se ne bi trebao koristiti izvan implementacije opendira .

O_DIRECT

Pokušajte da minimizirate keš efekte I / O-a u ovu datoteku. Generalno, to će degradirati performanse, ali je korisno u posebnim situacijama, kao što je kada aplikacije vrše sopstveni keširanje. File I / O se vrši direktno u / iz korisničkih bafera. I / O je sinhroni, tj. Pri završetku sistema čitanja (2) ili write (2), podaci su garantovani da su preneseni. Veličina prenosa i poravnanje korisničkog pufera i offset fajla moraju biti višestruki od veličine logičkog bloka datotečnog sistema.
Ova zastava je podržana na više Unix-like sistema; podrška je dodat pod Linux-om u verziji 2.4.10 kernela.
Semantički sličan interfejs za blok uređaje opisan je u sirovom (8).

O_ASYNC

Generišite signal (SIGIO po podrazumevanoj vrednosti, ali to se može promeniti pomoću fcntl (2)) kada je ulaz ili izlaz postao moguć za ovaj deskriptor datoteke. Ova funkcija je dostupna samo za terminale, pseudo-terminale i utičnice. Za dodatne detalje pogledajte fcntl (2).

O_LARGEFILE

Na 32-bitnim sistemima koji podržavaju sistem velikih fajlova, dozvolite fajlove čije veličine ne mogu biti predstavljene u 31 bit.

Neke od ovih opcionih zastava mogu se izmeniti koristeći fcntl nakon što je datoteka otvorena.

Režim rasprave određuje dozvole za upotrebu u slučaju kreiranja nove datoteke. To je modifikovano umaskom procesa na uobičajeni način: dozvole kreirane datoteke su (mode & ~ umask) . Imajte na umu da se ovaj režim odnosi samo na buduće pristupe novoformiranog fajla; otvoreni poziv koji stvara datoteku samo za čitanje može dobro vratiti deskriptor datoteke za čitanje / pisanje.

Sledeće simboličke konstante su date za mod :

S_IRWXU

00700 korisnik (vlasnik datoteke) ima čitanje, pisanje i izvršavanje dozvole

S_IRUSR (S_IREAD)

Korisnik 00400 ima odobrenje za čitanje

S_IWUSR (S_IWRITE)

Korisnik 00200 ima dozvolu za pisanje

S_IXUSR (S_IEXEC)

Korisnik 00100 ima izvršnu dozvolu

S_IRWXG

Grupa 00070 je čitala, pisala i izvršila dozvolu

S_IRGRP

Grupa 00040 ima dozvolu za čitanje

S_IWGRP

Grupa 00020 ima dozvolu za pisanje

S_IXGRP

Grupa 00010 ima izvršnu dozvolu

S_IRWXO

00007 drugi imaju čitanje, pisanje i izvršavanje dozvole

S_IROTH

Drugi imaju dozvolu za čitanje

S_IWOTH

Drugi imaju dozvolu za pisanje

S_IXOTH

Drugi imaju izvršnu dozvolu

režim mora biti specificiran kada je O_CREAT u zastavama i zanemaruje se drugačije.

kreat se ekvivalentno otvara sa zastavama koje su jednake O_CREAT | O_WRONLY | O_TRUNC .

POVRATNA VRIJEDNOST

otvoreni i kreator vraća novi deskriptor datoteke ili -1 ako se desila greška (u tom slučaju, errno je postavljen na odgovarajući način). Imajte na umu da otvoreni mogu otvoriti specijalne datoteke uređaja, ali kreator ne može da ih kreira - umesto toga koristite mknod (2).

Na NFS datotečnim sistemima sa omogućenim mapiranjem UID-a, otvoreni mogu vratiti deskriptor datoteke, ali npr. Zahtjevi za čitanje (2) su odbijeni sa EACCES-om . To je zato što klijent obavlja otvoren provjeravanjem dozvola, ali UID mapiranje vrši server na zahtjevima za čitanje i pisanje.

Ako je datoteka novootvorena, njene atime, ctime, mtime polja su postavljene na trenutno vreme, kao i ctime i mtime polja roditeljskog direktorija. U suprotnom, ako je datoteka izmijenjena zbog oznake O_TRUNC, polja ctime i mtime su postavljena na trenutno vrijeme.

Greške

EEXIST

putanje već postoji i O_CREAT i O_EXCL su korišćeni.

EISDIR

pathname se odnosi na direktorij i uključeno pisanje za pristup (tj. O_WRONLY ili O_RDWR je postavljeno).

EACCES

Zahtevani pristup datoteci nije dozvoljen, ili jedan od direktorijuma u putanju nije dozvolio traženje (izvršavanje) ili datoteka još nije postojala i pristup pisanju roditeljskog imenika nije dozvoljen.

ENAMETOOLONG

putanja je bila predugačka.

ENOENT

O_CREAT nije podešen i imenovana datoteka ne postoji. Ili, komponenta direktorijuma u putanji ne postoji ili predstavlja simboličnu vezu.

ENOTDIR

Komponenta koja se koristi kao direktorijum u putanji nije zapravo direktorij, ili O_DIRECTORY je određen i pathname nije direktorijum.

ENXIO

O_NONBLOCK | O_WRONLY je postavljen, naziva datoteka je FIFO i nijedan proces nema datoteku otvorenu za čitanje. Ili, datoteka je specijalna datoteka uređaja i nema odgovarajućeg uređaja.

ENODEV

pathname se odnosi na posebnu datoteku uređaja i ne postoji odgovarajući uređaj. (Ovo je greška Linux kernela - u ovoj situaciji ENXIO mora biti vraćena.)

EROFS

ime putanja se odnosi na datoteku u datotečnom sistemu samo za čitanje i zahtevan je pristup pisanju.

ETXTBSY

pathname odnosi se na izvršnu sliku koja se trenutno izvršava i zahteva se upisivanje.

EFAULT

putanje tačke izvan vašeg pristupačnog adresnog prostora.

ELOOP

U rješavanju imena puta došlo je do previše simboličkih veza, ili je O_NOFOLLOW naznačen, ali je putanje simboličnom vezom.

ENOSPC

putanje je napravljeno, ali uređaj koji sadrži putanje nema prostor za novu datoteku.

ENOMEM

Dostupna je nedovoljna memorija kernela.

EMFILE

Proces već ima maksimalan broj datoteka otvorenih.

ENFILE

Dostignuta je granica ukupnog broja datoteka otvorenih na sistemu.

U skladu sa

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW i O_DIRECTORY zastave su Linux -specifične. Možda će morati da definišu makro _GNU_SOURCE da bi dobili svoje definicije.

Ograničenja

U protokolu koji se temelji na NFS-u postoji mnogo neizvjesnosti, što utječe između ostalog O_SYNC i O_NDELAY .

POSIX obezbeđuje tri različite varijante sinhronizovanog I / O, koji odgovaraju oznakama O_SYNC , O_DSYNC i O_RSYNC . Trenutno su (2.1.130) svi oni sinonimni pod Linuxom.