Skip to main content

Odprite ukaz Linux in ukaz Unix

Anonim

Povzetek

#include #include #include int odprt (const char * ime poti , int zastave ); int odprt (const char * ime poti , int zastave , način_t način ); int creat (const char * ime poti , način_t način );

Opis

Theodprto() sistemski klic linux ukaz se uporablja za pretvorbo poti v deskriptor datoteke (majhno, negativno celo število za uporabo v kasnejših V / I kot pri preberite, piši, 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 deljene odprte datoteke se lahko pojavijo prekvilice(2) sistemski klic.) Novi deskriptor datoteke naj ostane odprt pri funkcijah exec (glejtefcntl(2)). Izravnava datoteke je nastavljena na začetek datoteke.

Parameter zastave je ena odO_RDONLY, O_WRONLY aliO_RDWR ki zahtevajo odpiranje datoteke samo za branje, samo za pisanje ali branje / pisanje, 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 opcije bsdgroups in sysvgroups datotečnega sistema ext2, kot je opisano vMount(8)).

O_EXCL

Pri uporabi zO_CREAT, če datoteka že obstaja, je napaka inodprto bo propadel. 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 opravljajo naloge zaklepanja, bodo vsebovali stanje dirke. Rešitev za zaklepanje atomske datoteke z zaklepanjem je ustvariti edinstveno datoteko na istem računalniku (npr. Vključiti ime gostitelja in pid), uporabiti povezavo (2), da povežete datoteko s ključavnico. Čepovezava () vrne 0, zaklepanje je uspešno. V nasprotnem primeru uporabite stat(2) na edinstveni datoteki, da preverite, ali se je število povezav povečalo na 2, v tem primeru je ključavnica tudi uspešna.

O_NOCTTY

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

O_TRUNC

Če datoteka že obstaja in je redna datoteka in odprt način omogoča pisanje (to je, je O_RDWR ali O_WRONLY), bo skrajšan na dolžino 0. Če je datoteka datoteka FIFO ali 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 vsakimpiši, se kazalec datoteke nahaja na koncu datoteke, tako kot prilseek. O_APPEND lahko privede do poškodovanih datotek na 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 aliO_NDELAY

Če je mogoče, se datoteka odpre v načinu brez blokiranja. Nitiodprto niti nadaljnje operacije v datotečnem deskriptorju, ki se vrne, bo povzročilo postopek klicanja. Za ravnanje s FIFO (imenovanimi cevi) glejte tudififo(4). Ta način ne sme vplivati ​​na datoteke, razen na FIFO.

O_SYNC

Datoteka je odprta za sinhrono V / I. Kajpišis na nastalem deskriptorju datoteke blokira postopek klicanja, dokler podatki niso fizično zapisani na osnovno strojno opremo. Ampak spodaj si oglejte spodnjo OZNAKE.

O_NOFOLLOW

Če ime poti je 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 mapa, povzroči, da je odprt. Ta zastava je specifična za Linux in je bila dodana v različici jedra 2.1.126, da bi se izognili težavam z zanikanjem storitve, čeopendir(3) se kliče na FIFO ali tračno napravo, vendar se ne sme uporabljati zunaj izvajanjaopendir.

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 preberite(2) alipiši(2) sistemski klic, podatki so zagotovljeni, da so bili 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 vsurov(8).

O_ASYNC

Ustvari signal (privzeto SIGIO, vendar ga lahko spremenite prekfcntl(2)), ko je v tem dokumentu opisan vnos ali izhod. Ta funkcija je na voljo samo za terminale, pseudo-terminale in vtičnice. Glejfcntl(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 uporabofcntl po odprtju datoteke.

Argument način določa dovoljenja za uporabo, če je ustvarjena nova datoteka. To je spremenjeno s procesomumask 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; naodprtoklic, ki ustvari datoteko, ki je samo za branje, lahko vrne deskriptor za branje / pisanje datotek.

Določene so naslednje simbolične konstante 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

način je treba navesti, kdajO_CREAT je v zastave , in se ne upošteva drugače.

stvar je enakovredenodprto z zastave enakoO_CREAT | O_WRONLY | O_TRUNC.

POVRATNA VREDNOST

odprto instvar vrne nov deskriptor datotek ali -1, če je prišlo do napake (v tem primeru, errno je ustrezno nastavljen). Upoštevajte, daodprto lahko odprejo posebne datoteke za naprave, vendarstvar jih ne morete ustvariti - uporabitemknod(2).

Na datotečnih sistemih NFS z omogočeno mapiranjem UID-odprto lahko vrne deskriptor datoteke, npr. preberite(2) zahteve so zavrnjeneEACCES. To je zato, ker stranka opravljaodprto s preverjanjem dovoljenj, vendar pa UID kartiranje 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 poti že obstaja inO_CREAT inO_EXCL so bili uporabljeni.

EISDIR

ime poti se nanaša na imenik in zahtevani dostop vključuje pisanje (to je,O_WRONLY aliO_RDWR je nastavljen).

EACCES

Zahtevani dostop do datoteke ni dovoljen ali eden od imenikov v ime poti ni dovolil dovoljenja za iskanje (izvršitev) ali pa še ni obstajala, dostop do nadrejenega imenika pa ni dovoljen.

ENAMETOOLONG

ime poti predolgo.

ENOENT

O_CREAT ni nastavljen in imenovana datoteka ne obstaja. Ali, komponenta imenika v ime poti ne obstaja ali pa je simbolična povezava.

ENOTDIR

Komponenta, ki se uporablja kot imenik v ime poti dejansko ni imenik, aliO_DIRECTORYje bil določen in ime poti ni bil imenovan.

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 je zahtevan dostop za pisanje.

ETXTBSY

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

EFAULT

ime poti točke zunaj vašega dostopnega naslovnega prostora.

ELOOP

Pri reševanju je prišlo do preveč simboličnih povezav ime poti , aliO_NOFOLLOW je bil določen, vendar ime poti je bila simbolična povezava.

ENOSPC

ime poti je bil ustvarjen, vendar naprava 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.3O_NOFOLLOW inO_DIRECTORY zastave so specifične za Linux. Morda bo treba definirati_GNU_SOURCE makro, da bi dobili svoje definicije.

Omejitve

V protokolu, na katerem temelji NFS, je veliko nejasnosti, ki med drugim vplivaO_SYNC inO_NDELAY.

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