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.