Kokkuvõte
#include << A HREF = "file: /usr/include/sys/types.h"> sys / types.h> #include << HREF = "file: /usr/include/sys/stat.h"> sys / stat.h> #include << A HREF = "file: /usr/include/fcntl.h"> fcntl.h> int avatud (const char * pathname , int- lipud ); int avatud (const char * pathname , int lipud , mode_t režiim ); int creat (const char * pathname, mode_t mode );Kirjeldus
Avatud () süsteemikõne linux- käsku kasutatakse aadressi teisendamiseks failidekirjeldajana (väike mittenegatiivne täisarv, mida kasutatakse järgnevas I / O-s kui lugeda , kirjutada jne). Kui kõne on edukas, tagas failidekirjutanuks wil on madalaim faili deskriptor, mida protsess ei avata praegu. See kõne loob uue avatud faili, mida ei jagata ühegi teise protsessiga. (Kuid jagatud avatud failid võivad tekkida kahvli (2) süsteemikõne kaudu.) Uus faili deskriptor on seatud avatud toimingute funktsioonidele (vt fcntl (2)). Faili nihe on seatud faili alguseks.
Parameetri lipud on üks O_RDONLY , O_WRONLY või O_RDWR, mis taotlevad faili ainult lugemise, kirjutamise või kirjutamise või kirjutamise avamist vastavalt bitwise- või d-le nulli või järgmisega:
O_CREAT
Kui faili ei eksisteeri, luuakse see. Faili omanik (kasutaja ID) määratakse protsessi tõhusaks kasutaja IDks. Grupi omandiõigus (rühma ID) määratakse kas protsessi tegeliku rühma ID või vanema kataloogi rühma ID-ga (sõltuvalt failisüsteemi tüübist ja mount mountingidest ning emapäringu režiimist, vt nt mount ext2-failisüsteemi bsdgroups ja sysvgroups , nagu kirjeldatud mount (8)).
O_EXCL
Kui seda kasutatakse koos O_CREAT-iga , kui fail on juba olemas, on see viga ja avaneb ebaõnnestumine. Selles kontekstis eksisteerib sümboolne link, sõltumata sellest, kus see viitab. O_EXCL on purustatud NFS-failisüsteemides , kusjuures lukustamisega seotud ülesannete täitmiseks kasutatavad programmid sisaldavad võistluse tingimusi. Lahendus aafinefailide lukustamiseks lukumeid kasutades on luua sama faili jaoks unikaalne fail (nt hosti nime ja pidi sisaldav), lingilifaili linkimiseks lingi (2) abil. Kui link () tagastab 0, on lukk edukas. Vastasel juhul kasuta unikaalsel failil statistiisi (2), et kontrollida, kas selle linkide arv on tõusnud 2-ni, millisel juhul lukk on samuti edukas.
O_NOCTTY
Kui pathname viitab lõppseadmele --- vaata tty (4) --- ei muutu see protsessi kontrolleraks, isegi kui protsessil pole seda.
O_TRUNC
Kui fail on juba olemas ja on tavaline fail ja avatud režiim võimaldab kirjutamist (st on O_RDWR või O_WRONLY), lühendatakse see pikkusega 0. Kui fail on FIFO või lõppseadme fail, siis ignoreeritakse O_TRUNC-lipp. Vastasel juhul ei ole O_TRUNC mõju täpsustatud. (Paljude Linuxi versioonide puhul ignoreeritakse seda, teistes versioonides tagastab see vea.)
O_APPEND
Fail avatakse lisamisrežiimis. Enne iga kirjutamist asetatakse failiülevaade faili lõpus, justkui lseekiga . O_APPEND võib põhjustada NFS-failisüsteemides rikutud faile, kui korraga lisatakse failile andmed rohkem kui ühe protsessi kohta. Seda seetõttu, et NFS ei toeta faili lisamist, nii et kliendi kernel peab seda simuleerima, mida ei saa teha ilma võistluse tingimustes.
O_NONBLOCK või O_NDELAY
Võimalusel avatakse fail mitteblokeerivas režiimis. Tagasilükatud failidekirjutajal ei avane avatud ega ka järgnevad toimingud, mis kutsuvad ootama. FIFOde (nn torude) käitlemise kohta vt ka viienda lõiget (4). See režiim ei pruugi mõjutada faile peale FIFO-de.
O_SYNC
Fail avatakse sünkroonsele I / O-le. Iga faili deskriptori kirjutamise ajal blokeerib helistamisprotsessi, kuni andmed on füüsiliselt kirjutatud aluseks olevale riistvarale. Kuid vaata allpool RESTRITSATSIOONID.
O_NOFOLLOW
Kui pathname on sümboolne link, siis avaneb ebaõnnestumine. See on FreeBSD laiendus, mis lisati Linuxile versioonis 2.1.126. Tähiste varasemate komponentide sümbolilinke järgitakse ikka veel. Glibc 2.0.100 ja uuemad päised sisaldavad selle lipuriiki; tuumad enne 2.1.126 ignoreerivad seda, kui seda kasutatakse .
O_DIRECTORY
Kui pathname ei ole kataloog, siis avage see ebaõnnestumiseks. See lipp on Linuxile spetsiifiline ja see lisati kerneli versioonile 2.1.126, et vältida teenusetõkestamise probleeme, kui opendir (3) kutsutakse FIFO või lindiseadmele, kuid seda ei tohiks kasutada väljaspool opendir rakendamist .
O_DIRECT
Proovige minimeerida I / O vahemälu efekte selle faili juurde. Üldiselt halvendab see jõudlust, kuid see on kasulik eriolukordades, näiteks siis, kui rakendused teevad oma vahemällu. Faili I / O tehakse otse kasutaja ruumi puhvritele / kasutajatele. I / O on sünkroonne, st loetud (2) või kirjutamise (2) süsteemi kõne lõppedes on andmed garanteeritud, et need on üle kantud. Ümberpaigutusmõõdud ning kasutaja puhvri ja faili nihete joondamine peavad olema kõik failisüsteemi loogilise ploki suurused.
Seda lipp toetatakse arvukalt Unix-tüüpi süsteeme; Linuxi tugi lisati kerneli versioonile 2.4.10.
Blokeerimisseadmete semantiliselt sarnast liidest kirjeldatakse toores (8).
O_ASYNC
Hankige signaal (vaikimisi SIGIO, kuid seda saab muuta fcntl (2) abil), kui sisend või väljund saab selle faili deskriptori jaoks võimalikuks. See funktsioon on saadaval ainult terminalide, pseudoterminalide ja pistikupesade jaoks. Lisateavet vt fcntl (2).
O_LARGEFILE
Suurfailide süsteemi toetavate 32-bitiste süsteemide puhul lubatakse faile, mille suurusi 31 bitidena ei saa esitada.
Mõned neist vabatahtlikest lipudest saab fcntl- faili pärast faili avamist muuta.
Argumentide režiim määrab uue faili loomisel kasutatavad õigused. Selle protsessi umask muudab seda tavapärasel viisil: loodud faili õigused on (mode & ~ umask) . Pidage meeles, et see režiim kehtib ainult äsja loodud faili tulevastele pöördumistele; avatud kõne, mis loob ainult lugemisõigusega faili, võib tagastada lugemis- / kirjutamisfailide deskriptor.
Režiimile on antud järgmised sümbolikonstandid:
S_IRWXU
Kasutaja 00700 (faili omanik) on loa loonud, kirjutanud ja täitnud
S_IRUSR (S_IREAD)
00400 kasutaja loeb luba
S_IWUSR (S_IWRITE)
00200 kasutaja on kirjutamisõigus
S_IXUSR (S_IEXEC)
00100 kasutaja on luba täitnud
S_IRWXG
00070 grupp on loa loonud, kirjutanud ja täitnud
S_IRGRP
00040 grupp loeb luba
S_IWGRP
00020 grupil on kirjutamisõigus
S_IXGRP
00010 grupil on käitamisluba
S_IRWXO
00007 teised on loa loonud, kirjutanud ja täitnud
S_IROTH
00004 teised on lugenud loa
S_IWOTH
00002 teistel on kirjutamisõigus
S_IXOTH
00001 teistel on luba täita
režiim tuleb määrata, kui O_CREAT on lipu all ja ignoreeritakse muul viisil.
Creat on samaväärne avaga lipuga, mis on võrdne O_CREAT | O_WRONLY | O_TRUNC .
TAGASI VÄÄRTUS
avaneb ja creat tagastab uue faili deskriptori või -1 kui ilmnes viga (sellisel juhul on errno seatud sobivalt). Pange tähele, et avatud võib avada seadme erifaile , kuid creat ei saa neid luua - kasutage selle asemel mknod (2).
Uuendusliku kaardistamisega lubatud NFS-failisüsteemidel võib avada failidekirjutatu tagasi, kuid e- posti aadressil EACCES on keelatud lugeda (2) taotlust. Seda põhjusel, et klient täidab lubasid kontrollides avatuna , kuid server sooritab UID kaardistamist päringute lugemise ja kirjutamise järel.
Kui fail on äsja loodud, on selle atime, ctime ja mtime-väljad seadistatud praegusele kellaajale ning ka vanemakataloogi ctime- ja mtime-väljad. Vastasel juhul, kui faili muudetakse O_TRUNC-lipuriigi tõttu, on selle ctime- ja mtime-väljad seadistatud praegusele kellaajale.
Vead
EEXIST
Pathname on juba olemas ja kasutati O_CREAT ja O_EXCL .
EISDIR
pathname viitab kataloogile ja juurdepääsuks, mida on vaja kirjutada (st O_WRONLY või O_RDWR on määratud).
EACCES
Taotletud juurdepääs failile ei ole lubatud või üks pathnamaal asuvatest kataloogidest ei võimaldanud otsingu (käivitamise) luba või faili veel ei olnud ja kirjutamise võimalus vanemakataloogile ei ole lubatud.
ENAMETOOLONG
sõna oli liiga pikk.
ENOENT
O_CREAT pole määratud ja nimega faili ei eksisteeri. Või ka sõnaühenduse kataloogi komponent pole olemas või see on sümboolne link.
ENOTDIR
Kasutajaliidese kataloogina kasutatav komponent ei ole tegelikult kataloog või oli määratud O_DIRECTORY ja pathname ei olnud kataloog.
ENXIO
O_NONBLOCK | | O_WRONLY on määratud, nimega fail on FIFO ja protsess ei ole avatud lugemiseks. Või fail on seadme erifail ja vastavat seadet pole olemas.
ENODEV
pathname viitab seadme erifailile ja vastavat seadet pole olemas. (See on Linuxi kerneli viga - sellises olukorras tuleb ENXIO tagastada.)
EROFS
pathname viitab failile kirjutuskaitstud failisüsteemis ja kirjutamisõigust taotletakse.
ETXTBSY
pathname viitab täidetavale pildile, mida praegu käivitatakse ja kirjutamisõigust taotletakse.
EFAULT
parameetreid väljaspool teie juurdepääsetavat aadressiruumi.
ELOOP
Püünime lahendamisel tekkis liiga palju sümboolseid linke või oli määratud O_NOFOLLOW, kuid pathname oli sümboolne link.
ENOSPC
pääsukood loodi, kuid saidil nimega seadmel pole ruumi uuele failile.
ENOMEM
Kerneli mälu oli ebapiisav.
EMFILE
Protsessis on juba avatavate failide maksimaalne arv.
ENFILE
Süsteemile avatud failide koguarv on piiratud.
Vastavuses
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW ja O_DIRECTORY lipud on Linuxi spetsiifilised. Mõistete saamiseks võib olla vaja määratleda _GNU_SOURCE makro.
Piirangud
NFS-i aluseks olevas protokollis on palju häireid , mis mõjutavad muu hulgas O_SYNC ja O_NDELAY .
POSIX pakub sünkroonitud sisend / väljundi kolme erinevat varianti, mis vastavad lipule O_SYNC , O_DSYNC ja O_RSYNC . Praegu (2.1.130) kõik need on sünonüümid Linuxi all.