Õpi Linuxi käsku ava

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.