Naučite Linux Command Open

Povzetek

#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 odprt (const char * ime poti , int zastavice ); int odprt (const char * ime poti , int zastavice , način mode_t ); int creat (const char * ime poti , način mode_t );

Opis

Odprt () sistemski klic linux ukaz se uporablja za pretvorbo poti v deskriptor datoteke (majhno, negativno celo število za uporabo v kasnejših I / O kot pri branju , pisanju itd.). Ko je klic uspešen, se deskriptor datoteke vrne z najnižjim deskriptorjem datoteke, ki trenutno ni odprt za postopek. Ta klic ustvari novo odprto datoteko, ki ni deljena z nobenim drugim procesom. (Toda skupne odprte datoteke se lahko pojavijo prek sistemskega klica fork (2).) Novi deskriptor datoteke naj ostane odprt pri funkcijah exec (glejte fcntl (2)). Izravnava datoteke je nastavljena na začetek datoteke.

Parameter zastave je eden od O_RDONLY , O_WRONLY ali O_RDWR, ki zahteva odpiranje datoteke samo za branje, samo za pisanje ali branje / pisanje, bodisi bitno- ali 'd z nič ali več od naslednjega:

O_CREAT

Če datoteka ne obstaja, bo ustvarjena. Lastnik (ID uporabnika) datoteke je nastavljen na dejansko uporabniško identifikacijo procesa. Lastništvo skupine (ID skupine) je nastavljeno bodisi na efektivno skupino ID procesa bodisi na ID skupine nadrejenega imenika (odvisno od vrste datotečnega sistema in možnosti namestitve ter načina nadrejenega imenika, glej npr. Namestitev možnosti bsdgroups in sysvgroups datotečnega sistema ext2, kot je opisano v gori (8)).

O_EXCL

Če se uporablja z O_CREAT , če datoteka že obstaja, je napaka in odprtost ne bo uspela. V tem kontekstu obstaja simbolična povezava, ne glede na to, kje se navezuje na. O_EXCL je prekinjen na datotečnih sistemih NFS , programi, ki se zanašajo na to, da izvajajo zaklepanje nalog, bodo vsebovali stanje dirke. Rešitev za zaklepanje atomske datoteke z zaklepanjem je ustvariti edinstveno datoteko na istem računalniku fs (npr. Vključiti ime gostitelja in pid), uporabiti povezavo (2), da povežete datoteko s ključavnico. Če link () vrne 0, je ključavnica uspešna. V nasprotnem primeru uporabite stat (2) v edinstveni datoteki, da preverite, ali se je število povezav povečalo na 2, v tem primeru pa je tudi ključavnica uspešna.

O_NOCTTY

Če se ime poti nanaša na terminalsko napravo --- glejte tty (4) --- ne bo postalo nadzorni terminal procesa, tudi če proces nima.

O_TRUNC

Če datoteka že obstaja in je redna datoteka in odprt način omogoča pisanje (tj. Je O_RDWR ali O_WRONLY), se bo skrajšal na dolžino 0. Če je datoteka datoteka FIFO ali datoteka končne naprave, se zastava O_TRUNC ne upošteva. V nasprotnem primeru je učinek O_TRUNC nespecificiran. (V mnogih različicah Linuxa bo prezrta, pri drugih različicah pa bo vrnila napako.)

O_APPEND

Datoteka se odpre v načinu dodajanja. Pred vsakim pisanjem se kazalec datoteke nahaja na koncu datoteke, tako kot pri lseek . O_APPEND lahko privede do poškodovanih datotek v datotečnih sistemih NFS, če več kot en proces hrani podatke v datoteko hkrati. To je zato, ker NFS ne podpira dodajanja datoteke, zato mora jedro odjemalca simulirati, kar pa ni mogoče storiti brez pogojev za tekmovanje.

O_NONBLOCK ali O_NDELAY

Če je mogoče, se datoteka odpre v načinu brez blokiranja. Niti odprte niti nadaljnje operacije v datotečnem deskriptorju, ki je vrnjeno, bodo povzročile, da bo proces klicanja počakal. Za ravnanje s FIFO (poimenovane cevi) glej tudi fifo (4). Ta način ne sme vplivati ​​na datoteke, razen na FIFO.

O_SYNC

Datoteka je odprta za sinhrono V / I. Vsako zapisovanje s iz opisnega deskriptorja datoteke bo blokiralo postopek klicanja, dokler podatki niso fizično zapisani na osnovno strojno opremo. Ampak spodaj si oglejte spodnjo OZNAKE.

O_NOFOLLOW

Če je ime poti simbolična povezava, potem odprta ne uspe. To je razširitev FreeBSD, ki je bila dodana v Linux v različici 2.1.126. Še vedno bodo sledile simbolične povezave v prejšnjih komponentah poti. Glave iz glibc 2.0.100 in pozneje vsebujejo opredelitev te zastavice; jedra pred 2.1.126 se bo, če se uporablja, zanemarjala .

O_DIRECTORY

Če ime poti ni v imeniku, pustite odprto, da ne bo uspelo. Ta zastavica je specifična za Linux in je bila dodana v različici jedra 2.1.126, da bi se izognili težavam z zavrnitvijo storitve, če je opendir (3) pozvan na FIFO ali kaseto, vendar se ne sme uporabljati zunaj izvajanja opendirja .

O_DIRECT

Poskusite zmanjšati predpomnilne učinke I / O v in iz te datoteke. Na splošno bo to poslabšalo učinkovitost, vendar je uporabno v posebnih okoliščinah, na primer, ko aplikacije izvajajo lastno predpomnjenje. File I / O se izvaja neposredno v / iz uporabniških puferov. V / I je sinhroniziran, tj. Ob zaključku sistemskega klica (2) ali write (2) je zagotovljeno, da so podatki preneseni. Velikosti prenosa in poravnava uporabniškega pufra in odmika datoteke morajo biti večkratnik velikosti logičnega bloka datotečnega sistema.
Ta zastava je podprta na številnih sistemih, podobnih Unixu; Podpora je bila dodana v Linux v jedru različice 2.4.10.
Semantično podoben vmesnik za blok naprave je opisan v surovem (8).

O_ASYNC

Ustvari signal (privzeto SIGIO, vendar se to lahko spremeni prek fcntl (2)), ko je v tem opisu datoteke mogoče vhod ali izhod. Ta funkcija je na voljo samo za terminale, pseudo-terminale in vtičnice. Glejte fcntl (2) za nadaljnje podrobnosti.

O_LARGEFILE

Na 32-bitnih sistemih, ki podpirajo sistem velikih datotek, omogočite datoteke, katerih velikosti ne morete biti predstavljene v 31 bitih, ki jih želite odpreti.

Nekatere od teh opcijskih zastav je mogoče spremeniti z uporabo fcntl po odprtju datoteke.

Način argumentov določa dovoljenja, ki jih je treba uporabiti, če se ustvari nova datoteka. To je spremenjeno z umaskom procesa na običajen način: dovoljenja za ustvarjeno datoteko so (način & ~ umask) . Upoštevajte, da se ta način uporablja samo za prihodnje dostope do novo ustvarjene datoteke; odprti klic, ki ustvari datoteko, ki je samo za branje, lahko tudi vrne deskriptor za branje / pisanje datotek.

Naslednje simbolne konstante so na voljo za način :

S_IRWXU

Uporabnik 00700 (lastnik datoteke) je prebral, pisal in izvršil dovoljenje

S_IRUSR (S_IREAD)

Uporabnik 00400 ima dovoljenje za branje

S_IWUSR (S_IWRITE)

Uporabnik 00200 ima dovoljenje za pisanje

S_IXUSR (S_IEXEC)

Uporabnik 00100 ima dovoljenje za izvajanje

S_IRWXG

Skupina 00070 je brala, pisala in izvršila dovoljenje

S_IRGRP

Skupina 00040 ima dovoljenje za branje

S_IWGRP

Skupina 00020 ima dovoljenje za pisanje

S_IXGRP

Skupina 00010 ima dovoljenje za izvajanje

S_IRWXO

Drugi so prebrali, pisali in izvršili dovoljenje

S_IROTH

Drugi imajo dovoljenje za branje

S_IWOTH

Drugi imajo dovoljenje za pisanje

S_IXOTH

Drugi imajo izvršilno dovoljenje

je treba določiti, ko je O_CREAT v zastavah , in se ne upošteva drugače.

creat je enakovreden, da se odpre z zastavami, ki so enake O_CREAT | O_WRONLY | O_TRUNC .

POVRATNA VREDNOST

odprto in ustvarjeno vrne novi deskriptor datotek ali -1, če se je zgodila napaka (v tem primeru je errno ustrezno nastavljen). Upoštevajte, da lahko odprete odprete posebne datoteke za naprave, vendar jih ne more ustvariti - uporabite mknod (2).

V datotečnih sistemih NFS z omogočeno mapiranjem UID lahko odprejo datoteko deskriptor, na primer z branjem (2) zahtevi se zavrnejo z EACCES . To je zato, ker odjemalec izvaja odprto s preverjanjem dovoljenj, vendar UID preslikava izvaja strežnik pri zahtevah za branje in pisanje.

Če je datoteka na novo ustvarjena, so atomi, ctime, mtime polja nastavljeni na trenutni čas, kot tudi polja ctime in mtime nadrejenega imenika. V nasprotnem primeru, če je datoteka spremenjena zaradi oznake O_TRUNC, so polja ctime in mtime nastavljena na trenutni čas.

Napake

EEXIST

ime poteka že obstaja, uporabljene so bile O_CREAT in O_EXCL .

EISDIR

ime poti se nanaša na imenik in zahteva, ki je vključena v pisanje (to je O_WRONLY ali O_RDWR ).

EACCES

Zahtevani dostop do datoteke ni dovoljen ali pa eden od imenikov v poti nima dovoljenja za iskanje (izvrši), ali datoteka še ni obstajala in dostop do nadrejenega imenika ni dovoljen.

ENAMETOOLONG

ime poti je bilo predolgo.

ENOENT

O_CREAT ni nastavljen in imenovana datoteka ne obstaja. Ali pa komponenta imenikov v poti ne obstaja ali je simbolična povezava s prepletanjem.

ENOTDIR

Komponenta, ki se uporablja kot imenik v poti , ni v resnici imenovan niti O_DIRECTORY in ime poti ni bilo v imeniku.

ENXIO

O_NONBLOCK | O_WRONLY je nastavljen, imenovana datoteka je FIFO in noben postopek ni odprt za branje. Ali pa je datoteka posebna datoteka naprave in nobena ustrezna naprava ne obstaja.

ENODEV

ime poti se nanaša na posebno datoteko naprave in nobena ustrezna naprava ne obstaja. (To je bug jedra Linuxa - v tem primeru ENXIO je treba vrniti.)

EROFS

ime poti se nanaša na datoteko v datotečnem sistemu samo za branje in zahtevano je pisanje.

ETXTBSY

ime poti se nanaša na izvedljivo sliko, ki se trenutno izvaja in je bil zahtevan dostop za pisanje.

EFAULT

potne točke izven dostopnega naslovnega prostora.

ELOOP

Pri reševanju imena poti je prišlo do preveč simboličnih povezav ali pa je bilo podano O_NOFOLLOW, toda pot je bila simbolična povezava.

ENOSPC

ime poteka je bilo ustvarjeno, vendar naprava, ki vsebuje ime poti , nima prostora za novo datoteko.

ENOMEM

Na voljo je bil premajhen pomnilnik jedra.

EMFILE

Proces ima že odprto največje število datotek.

ENFILE

Dosegla je omejitev skupnega števila datotek, odprtih v sistemu.

Skladno s

SVr4, SVID, POSIX, X / ODPRTO, BSD 4.3 Zastave O_NOFOLLOW in O_DIRECTORY so Linux -specificirane. Morda boste morali določiti makro _GNU_SOURCE, da bi dobili svoje definicije.

Omejitve

V protokolu, na katerem temelji NFS, je veliko nejasnosti , ki med drugim vplivajo na O_SYNC in O_NDELAY .

POSIX ponuja tri različne različice sinhroniziranih V / I, ki ustrezajo zastavama O_SYNC , O_DSYNC in O_RSYNC . Trenutno (2.1.130) so vsi sinonimni v Linuxu.