Opettele Linux Command Open

tiivistelmä

#include << A HREF = "file: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "tiedosto: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "file: /usr/include/fcntl.h"> fcntl.h> int avautuva (const char * polku , int lippuja ); int open (const char * polku , int- liput , mode_t- tila ); int creat (const char * polku , mode_t- tila );

Kuvaus

Open () system call linux -komentoa käytetään muuntamaan polun nimi tiedoston kuvaajaksi (pieni, ei-negatiivinen kokonaisluku käytettäväksi seuraavassa I / O: ssa, kuten lukemalla , kirjoittamalla jne.). Kun puhelu onnistuu, tiedostojen kuvaaja palautetaan mahdollisimman pieneksi tiedostojen kuvaajaksi, joka ei ole tällä hetkellä avoinna prosessille. Tämä puhelu luo uuden avoimen tiedoston, jota ei ole jaettu mihinkään muuhun prosessiin. (Mutta jaetut avoimet tiedostot voivat syntyä haarukan (2) järjestelmäpuhelun kautta.) Uusi tiedostekuvaaja on asetettu pysymään avoimina kaikkiin exec-toimintoihin (katso fcntl (2)). Tiedostosiirtymä on asetettu tiedoston alkuun.

Parametri- merkkivalot ovat O_RDONLY , O_WRONLY tai O_RDWR, jotka pyytävät avaamaan tiedoston vain luku-, kirjoitus- tai lukea / kirjoittaa vastaavasti bit- tai d-arvoina, joilla on nolla tai useampi seuraavista:

O_CREAT

Jos tiedostoa ei ole olemassa, se luodaan. Tiedoston omistaja (käyttäjätunnus) on määritetty prosessin tehokkaaksi käyttäjätunnukseksi. Ryhmän omistus (ryhmä-ID) asetetaan joko prosessin tehokkaaseen ryhmätunnisteeseen tai vanhemman hakemiston ryhmätunnisteeseen (riippuen tiedostojärjestelmän tyypistä ja asennusvaihtoehdoista sekä vanhemman hakemiston moodista, katso esim. ext2-tiedostojärjestelmän bsd-ryhmät ja sysv-ryhmät , kuten kuvassa 8 on kuvattu).

O_EXCL

Käytettäessä O_CREAT- tiedostoa, jos tiedosto on jo olemassa, se on virhe ja avoin epäonnistuu. Tässä yhteydessä symbolinen yhteys on olemassa, riippumatta siitä, mihin se viittaa. O_EXCL on rikki NFS-tiedostojärjestelmissä , ohjelmat, jotka perustuvat lukitustöiden suorittamiseen, sisältävät kilpailutilan. Ratkaisu ydinlukituksen suorittamiseen lukitustiedoston avulla on luoda ainutlaatuinen tiedosto samalle fs: lle (esim. Sisällyttämällä isäntänimeä ja pid), käytä linkkiä (2) linkin luomiseksi lukitustiedostoon. Jos linkki () palauttaa 0, lukitus onnistuu. Muussa tapauksessa käytä stat (2) ainutlaatuisessa tiedostossa sen tarkistamiseksi, onko sen linkkikoko kasvanut 2: ksi, jolloin lukko onnistuu.

O_NOCTTY

Jos polunimi viittaa päätelaitteeseen - katso tty (4) - se ei tule prosessin ohjauspäätteeksi, vaikka prosessissa ei olisi.

O_TRUNC

Jos tiedosto on jo olemassa ja se on tavallinen tiedosto ja avoin tila sallii kirjoittaa (eli O_RDWR tai O_WRONLY), se katkaistaan ​​pituudeksi 0. Jos tiedosto on FIFO- tai päätelaitatiedosto, O_TRUNC-lippu jätetään huomiotta. Muutoin O_TRUNCin vaikutus ei ole täsmennetty. (Monissa Linux- versioissa sitä ei oteta huomioon, muissa versioissa se palauttaa virheen.)

O_APPEND

Tiedosto avataan lisäystilassa. Ennen jokaista kirjoitusta , tiedoston osoitin sijoitetaan tiedoston loppuun, aivan kuten lseekin kanssa . O_APPEND saattaa johtaa vioittuneisiin tiedostoihin NFS-tiedostojärjestelmissä, jos useampi kuin yksi prosessi liittää tiedot tiedostoon kerralla. Tämä johtuu siitä, että NFS ei tue tiedoston liittämistä, joten asiakkaan ytimen on simuloitava se, jota ei voida tehdä ilman kilpailuedellytyksiä.

O_NONBLOCK tai O_NDELAY

Aina kun mahdollista, tiedosto avautuu estotilassa. Kumpikaan avoinna oleva tai myöhempi tiedostojen kuvaajalle tuleva toiminto ei aiheuta kutsuvan prosessin odottamaan. FIFO: n (nimettyjen putkien) käsittelyä varten katso myös FIFO (4). Tässä tilassa ei tarvitse olla vaikutusta muihin tiedostoihin kuin FIFO-tiedostoihin.

O_SYNC

Tiedosto avataan synkroniselle I / O: lle. Tuloksena olevaan tiedostojen kuvaajaan kirjoittavien kirjoitusosien avulla estetään kutsuvan prosessin, kunnes tiedot on kirjoitettu fyysisesti peruslaitteistoon. Katso kuitenkin alla olevat RAJOITUKSET.

O_NOFOLLOW

Jos polunimi on symbolinen linkki, avoin epäonnistuu. Tämä on FreeBSD-laajennus, joka lisättiin Linuxiin versiossa 2.1.126. Jatkossa on edelleen symbolien linkkejä aiempien komentotiedostojen osissa. Glibc 2.0.100: n ja sen myöhemmissä otsakkeissa on tämän lipun määritelmä; ytimet ennen 2.1.126 sivuuttaa sen, jos sitä käytetään .

O_DIRECTORY

Jos polunimi ei ole hakemisto, anna avaus epäonnistua. Tämä lippu on Linux-spesifinen, ja se lisättiin ydinversioon 2.1.126, jotta vältettäisiin palvelunestohyökkäykset, jos opendir (3) kutsutaan FIFO- tai nauha-laitteeksi, mutta sitä ei pidä käyttää opendirin .

O_DIRECT

Yritä minimoida I / O-välimuistitoiminnot tähän tiedostoon. Yleensä tämä heikentää suorituskykyä, mutta se on hyödyllinen erityistilanteissa, kuten silloin, kun sovellukset tekevät omat välimuistinsa. Tiedoston I / O- tiedosto suoritetaan suoraan käyttäjän avaruustukiasemiin. I / O on synkroninen, eli luetun (2) tai kirjoitusjärjestelmän (2) järjestelmäpuhelun loppuun saattamisen jälkeen data on taattu siirretty. Siirron koot ja käyttäjäpuskurin ja tiedostosiirron kohdistaminen on oltava tiedostojärjestelmän loogisen lohkokokoelman monikertoja.
Tätä lippua tukee useilla Unix-kaltaisilla järjestelmillä. tuki lisättiin Linuxissa ytimen versioon 2.4.10.
Lohkolaitteiden semanttisesti samanlainen rajapinta on kuvattu raakana (8).

O_ASYNC

Luo signaali (SIGIO oletusarvoisesti, mutta sitä voidaan muuttaa fcntl (2): n kautta), kun tulo tai ulostulo on mahdollinen tässä tiedostojen kuvaajassa . Tämä ominaisuus on käytettävissä vain päätelaitteille, pseudoterminaaleille ja pistorasioille. Lisätietoja fcntl (2).

O_LARGEFILE

32-bittisissä järjestelmissä, jotka tukevat suurta tiedostojärjestelmää, sallivat tiedostot, joiden kokoa ei voida edustaa 31 bittiä avattavissa.

Joitakin näistä valinnaisista lipuista voidaan muuttaa fcntl: llä sen jälkeen kun tiedosto on avattu.

Argumenttimoodi määrittää käyttöoikeudet, jos uutta tiedostoa luodaan. Sitä muokataan prosessin umaskilla tavallisella tavalla: luodun tiedoston oikeudet ovat (mode & ~ umask) . Huomaa, että tämä tila koskee vain äskettäin luotujen tiedostojen tulevia käyttöoikeuksia. avoin puhelu, joka luo vain luettavissa olevan tiedoston, saattaa palauttaa luku / kirjoitustiedoston kuvaajan.

Seuraavat symboliset vakiot toimitetaan tilaan :

S_IRWXU

00700 käyttäjä (tiedoston omistaja) on lukenut, kirjoitanut ja suorittanut luvan

S_IRUSR (S_IREAD)

00400 käyttäjällä on lupaa

S_IWUSR (S_IWRITE)

00200 käyttäjällä on kirjoitusoikeus

S_IXUSR (S_IEXEC)

00100 käyttäjä on suorittanut luvan

S_IRWXG

00070-ryhmä on lukenut, kirjoitanut ja suorittanut luvan

S_IRGRP

00040 ryhmä on lukenut luvan

S_IWGRP

00020-ryhmässä on kirjoitusoikeus

S_IXGRP

00010-ryhmä on suorittanut luvan

S_IRWXO

00007 toiset ovat lukeneet, kirjoittaneet ja suorittavat lupaa

S_IROTH

00004 toiset ovat lukeneet luvan

S_IWOTH

00002 muilla on kirjoitusoikeus

S_IXOTH

00001 muuta ovat suorittaneet luvan

tila on määritettävä, kun O_CREAT on lippuja , eikä sitä muuten huomioida.

creat vastaa avoimia lipuilla, jotka ovat yhtä suuret kuin O_CREAT | O_WRONLY | O_TRUNC .

PALAUTUSARVO

avaa ja creat palauttaa uuden tiedoston kuvaajan tai -1, jos tapahtui virhe (jolloin errno asetetaan oikein). Huomaa, että avoin voi avata laitteeseen erikoistiedostot, mutta creat ei voi luoda niitä - käytä sen sijaan mknod (2).

NFS-tiedostojärjestelmissä, joissa UID-kartoitus on otettu käyttöön, avoin voi palauttaa tiedostekuvaajan, mutta esimerkiksi luku (2) pyynnöt hylätään EACCESin avulla . Tämä johtuu siitä, että asiakas suorittaa avoimiksi tarkistamalla käyttöoikeudet, mutta palvelin suorittaa UID-kartoituksen lukija- ja kirjoituspyynnöissä.

Jos tiedosto on äskettäin luotu, sen atime, ctime, mtime kentät asetetaan nykyiseen ajankohtaan, samoin ovat myös emolevyn ctime- ja mtime-kentät. Muussa tapauksessa, jos tiedostoa muutetaan O_TRUNC-flagin vuoksi, sen ctime- ja mtime-kentät asetetaan nykyiseen aikaan.

virheet

EEXIST

polku on jo olemassa ja O_CREAT ja O_EXCL on käytössä.

EISDIR

polunimi viittaa hakemistoon ja pyydetty pääsy kirjattuun (eli O_WRONLY tai O_RDWR on asetettu).

EACCES

Pyydetty käyttöoikeus tiedostoon ei ole sallittu tai jokin hakemistossa olevista hakemistoista ei sallinut (suorita) lupaa tai tiedostoa ei ole vielä olemassa ja kirjoitusoikeus vanhemman hakemistoon ei ole sallittua.

ENAMETOOLONG

polunimi oli liian pitkä.

ENOENT

O_CREAT ei ole asetettu eikä nimettyä tiedostoa ole olemassa. Tai hakemiston osaa polunimessä ei ole tai se on himmeä symbolinen linkki.

ENOTDIR

Otsikko , jota käytetään hakemistossa polunimessä , ei ole itse asiassa hakemisto, tai O_DIRECTORY määritettiin ja polunimi ei ollut hakemisto.

ENXIO

O_NONBLOCK | O_WRONLY on asetettu, nimetty tiedosto on FIFO eikä prosessi ole tiedostoa avoin lukemista varten. Tai tiedosto on laitekohtainen tiedosto eikä vastaavaa laitetta ole.

ENODEV

polunimi tarkoittaa laitekohtaista tiedostoa, eikä vastaavaa laitetta ole. (Tämä on Linux-ytimen virhe - tässä tilanteessa ENXIO on palautettava.)

EROFS

polunimi tarkoittaa tiedostoa vain luku-tiedostojärjestelmässä ja kirjoitusoikeutta pyydettiin.

ETXTBSY

polunimi tarkoittaa suoritettavaa kuvaa, jota parhaillaan suoritetaan ja kirjoitusoikeutta pyydetään.

EFAULT

polkujen pisteiden osoitteet pois käytettävissä olevan osoitetilan ulkopuolella.

ELoop

Liian monta symbolista linkkiä kohdattiin polunimen ratkaisemisessa, tai O_NOFOLLOW määritettiin, mutta polku oli symbolinen linkki.

ENOSPC

polun nimi oli luotava, mutta polunimiä sisältävällä laitteella ei ole tilaa uudelle tiedostolle.

ENOMEM

Kernelimuisti oli riittämätön.

EMFILE

Prosessissa on jo enimmäismäärä tiedostoja auki.

ENFILE

Järjestelmän avoimien tiedostojen kokonaismäärä on saavutettu.

Täyttää

SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW- ja O_DIRECTORY- liput ovat Linux- spesifisiä. On ehkä määriteltävä _GNU_SOURCE- makro määritelmien saamiseksi .

rajoitukset

NFS: n taustalla olevassa protokollassa on monia epäkohtia, jotka vaikuttavat muun muassa O_SYNC ja O_NDELAY .

POSIX tarjoaa kolme eri synkronoidun I / O-versiota, jotka vastaavat lippuja O_SYNC , O_DSYNC ja O_RSYNC . Tällä hetkellä (2.1.130) nämä ovat kaikki yhtä Linuxissa.