përmbledhje
#include << Një HREF = "skedar: /usr/include/sys/types.h"> sys / types.h> #include "Një HREF =" file: /usr/include/sys/stat.h "> sys / stat.h> #include << Një HREF = "file: /usr/include/fcntl.h"> fcntl.h> int hapur (const char * pathname , int flags ); int open (const char * pathname , flamuj int , modaliteti mode ); int creat (const char * pathname , modaliteti mode );Përshkrim
Komanda e hapur () e thirrjes së sistemit linux përdoret për të kthyer një emër në një file përshkrues (një numër i vogël, jo-negativ për përdorim në I / O pasuese si me leximin , shkrimin etj). Kur thirrja është e suksesshme, descriptori i skedarit do të kthehet në skedarin më të ulët të skedarit që nuk është aktualisht i hapur për procesin. Kjo thirrje krijon një skedar të ri të hapur, që nuk ndahet me asnjë proces tjetër. (Por skedarët e hapur të hapur mund të shfaqen përmes thirrjes së sistemit të pirunëve (2).) Përshkrimi i skedarit të ri është vendosur të mbetet i hapur në të gjithë funksionet e ekzekutimit (shih fcntl (2)). Kompensimi i skedarit është vendosur në fillim të skedarit.
Flamujt e parametrave janë një nga O_RDONLY , O_WRONLY ose O_RDWR të cilat kërkojnë hapjen e skedarit vetëm për lexim, vetëm për shkrim ose për lexim / shkrim respektivisht bitwise ose d me zero ose më shumë nga sa vijon:
O_CREAT
Nëse skedari nuk ekziston, do të krijohet. Pronari (ID përdoruesi) i skedarit është vendosur në ID efektiv të përdoruesit të procesit. Pronësia e grupit (ID grupi) është vendosur ose në grupin ID efektiv të procesit ose në ID grupin e direktorisë prindërore (në varësi të llojit të skedarit të sistemit dhe opsioneve të montimit, si dhe mënyrës së drejtorit të prindërve, shih, p.sh. mali opsionet bsdgroups dhe sysvgroups të filesystem ext2, siç përshkruhet në malin (8)).
O_EXCL
Kur përdoret me O_CREAT , nëse skedari ekziston tashmë është një gabim dhe i hapur do të dështojë. Në këtë kontekst ekziston një lidhje simbolike, pavarësisht se ku ndodhen pikat e saj. O_EXCL është thyer në sistemet e skedarëve NFS , programet të cilat mbështeten në të për kryerjen e detyrave të kyçjes do të përmbajnë një gjendje gara. Zgjidhja për mbylljen e skedarëve atomikë duke përdorur një lockfile është krijimi i një skedari unik në të njëjtën fs (p.sh., duke inkorporuar hostname dhe pid), përdorni lidhjen (2) për të bërë një lidhje me fajllin e identifikimit. Nëse lidhja () kthen 0, kyçja është e suksesshme. Përndryshe, përdorni stat (2) në skedarin unik për të kontrolluar nëse numri i lidhjes është rritur në 2, me ç'rast bllokimi është gjithashtu i suksesshëm.
O_NOCTTY
Nëse pathname i referohet një pajisje të terminalit --- see tty (4) --- nuk do të bëhet terminali kontrollues i procesit edhe nëse procesi nuk e ka atë.
O_TRUNC
Nëse skedari tashmë ekziston dhe është skedar i rregullt dhe modaliteti i hapur lejon shkrimin (dmth. Është O_RDWR ose O_WRONLY) ajo do të prerë në gjatësi 0. Nëse skedari është skedar i pajisjes FIFO ose terminal, flamuri O_TRUNC injorohet. Përndryshe, efekti i O_TRUNC është i paspecifikuar. (Në shumë versione Linux ajo do të injorohet, në versione të tjera, do të kthehet një gabim.)
O_APPEND
Dosja hapet në modalitetin e shtojcës. Para çdo shkruani , treguesi i skedarit vendoset në fund të skedarit, sikur me lseek . O_APPEND mund të çojë në skedarë të korruptuar në skedarët e skedarëve NFS nëse më shumë se një proces i bashkon të dhënat në një skedar në të njëjtën kohë. Kjo është për shkak se NFS nuk e mbështet bashkëngjitjen e një skedari, prandaj kerneli i klientit duhet ta simulojë atë, gjë që nuk mund të bëhet pa kusht garë.
O_NONBLOCK ose O_NDELAY
Kur është e mundur, skedari hapet në mënyrë jo-bllokuese. As operacionet e hapura e as ndonjë operacion pasues në skedarin e file që kthehet nuk do të bëjnë që procesi i thirrjes të presë. Për trajtimin e FIFOs (tuba të emëruar), shih gjithashtu FIFO (4). Kjo mënyrë nuk duhet të ketë ndonjë efekt në skedarë të ndryshëm nga FIFOs.
O_SYNC
Dosja hapet për sinkron I / O. Çdo shkrim s në skedarin që rezulton në skedar do të bllokojë procesin e thirrjes deri sa të dhënat janë shkruar fizikisht në harduerin bazë. Shikoni KUFIZIMET më poshtë, megjithatë.
O_NOFOLLOW
Nëse pathname është një lidhje simbolike, atëherë e hapur dështon. Kjo është një shtrirje FreeBSD, e cila u shtua në Linux në versionin 2.1.126. Lidhjet simbolike në komponentët e mëparshëm të emrit të rrugës do të vazhdojnë të ndiqen. Kreu nga glibc 2.0.100 dhe më vonë përfshijnë një përkufizim të këtij flamuri; kernelit para 2.1.126 do ta injorojnë nëse përdoren .
O_DIRECTORY
Nëse emri i rrugës nuk është një direktori, atëherë hapni të dështojë. Ky flamur është specifik për Linux dhe u shtua në versionin 2.1.126 të kernelit, për të shmangur problemet e mohimit të shërbimit nëse opendir (3) thirret në një pajisje FIFO ose kasetë, por nuk duhet të përdoret jashtë zbatimit të opendir .
O_DIRECT
Përpiquni të minimizoni efektet e cache-së të I / O në dhe nga ky skedar. Në përgjithësi kjo do të degradojë performancën, por është e dobishme në situata të veçanta, të tilla si kur aplikacionet bëjnë cachingun e tyre. Skedari I / O është bërë direkt në / nga buffers space space. I / O është sinkron, pra në përfundimin e thirrjes së sistemit të lexuar (2) ose shkruaj (2), të dhënat garantohen se janë transferuar. Madhësitë e transferimit, dhe shtrirja e tamponit të përdoruesit dhe kompensimi i skedarit duhet të jenë të gjitha shumat e madhësisë së bllokut logjik të sistemit të skedarit.
Ky flamur mbështetet në një numër sistemesh si Unix; mbështetja u shtua nën Linux në versionin 2.4.10 të kernelit.
Një ndërfaqe semantike e ngjashme për pajisjet bllok është përshkruar në para (8).
O_ASYNC
Gjeneroni një sinjal (SIGIO me parazgjedhje, por kjo mund të ndryshohet nëpërmjet fcntl (2)) kur futja ose dalja bëhet e mundur në këtë përshkrues të skedarit. Ky funksion është i disponueshëm vetëm për terminalet, pseudo-terminalet dhe bazat. Shikoni fcntl (2) për hollësi të mëtejshme.
O_LARGEFILE
Në sistemet 32-bit që mbështesin sistemin e madhësisë së skedarëve, lejoni skedarët madhësitë e të cilave nuk mund të përfaqësohen në 31 bit që do të hapen.
Disa prej këtyre flamujve opsionale mund të ndryshohen duke përdorur fcntl pasi skedari të jetë hapur.
Modaliteti i argumentit specifikon lejet për t'u përdorur në rast të krijimit të një skedari të ri. Është modifikuar nga umask e procesit në mënyrën e zakonshme: lejet e skedës së krijuar janë (mode & umask) . Vini re se kjo mënyrë zbatohet vetëm për qasjet e ardhshme të skedarit të krijuar rishtazi; thirrja e hapur që krijon një skedar vetëm për lexim mund të kthejë një përshkrues skedari leximi / shkrimi.
Konstante simbolike janë dhënë për mënyrën :
S_IRWXU
00700 përdoruesi (pronari i skedarit) ka lexuar, shkruar dhe ekzekutuar lejen
S_IRUSR (S_IREAD)
00400 përdoruesi ka lexuar lejen
S_IWUSR (S_IWRITE)
Përdoruesi 00200 ka leje për shkrim
S_IXUSR (S_IEXEC)
00100 përdoruesi ka ekzekutuar lejen
S_IRWXG
00070 grupi ka lexuar, shkruar dhe ekzekutuar lejen
S_IRGRP
Grupi 00040 ka lexuar lejen
S_IWGRP
Grupi 00020 ka leje për shkrim
S_IXGRP
Grupi 00010 ka ekzekutuar lejen
S_IRWXO
00007 të tjerë kanë lexuar, shkruar dhe ekzekutuar lejen
S_IROTH
00004 të tjerë kanë lexuar lejen
S_IWOTH
00002 të tjerë kanë leje për shkrim
S_IXOTH
00001 të tjerë kanë ekzekutuar leje
duhet të specifikohen kur O_CREAT është në flamuj dhe është injoruar ndryshe.
krijohet ekuivalent me hapjen me flamuj të barabartë me O_CREAT | O_WRONLY | O_TRUNC .
KTHIMI I VLERËS
hapur dhe creat kthimin e descriptor file të ri, ose -1 nëse ka ndodhur një gabim (në të cilin rast, errno është vendosur në mënyrë të përshtatshme). Vini re se hapja mund të hapë skedarë të veçantë të pajisjes, por krijuesi nuk mund t'i krijojë ato - përdorni në vend mknod (2).
Në sistemet e skedarëve NFS me mapping UID të aktivizuara, të hapur mund të kthejnë një përshkrues të skedarëve, por p.sh. lexoni (2) kërkesat mohohen me EACCES . Kjo është për shkak se klienti kryen të hapur duke kontrolluar lejet, por hartimi i UID-it kryhet nga serveri pas leximit dhe shkrimit të kërkesave.
Nëse skedari është krijuar rishtazi, fushat e tij atime, ctime, mtime janë caktuar në kohën e tanishme, dhe kështu janë edhe fushat e orëve dhe orëve të drejtimit të prindërve. Përndryshe, nëse skedari është modifikuar për shkak të flamurit O_TRUNC, fushat e saj të orëve dhe fushave të orëve janë të vendosur në kohën e tanishme.
gabimet
EEXIST
pathname tashmë ekziston dhe O_CREAT dhe O_EXCL janë përdorur.
EISDIR
rruga lidhet me një direktori dhe qasja e kërkuar kërkohet me shkrim (dmth është vendosur O_WRONLY ose O_RDWR ).
EACCES
Qasja e kërkuar në skedë nuk lejohet, ose një prej drejtorive në pathname nuk lejoi kërkimin (ekzekutimin) e lejes, ose skedari nuk ekzistonte ende dhe shkruaj qasje në direktorinë prindërore nuk lejohet.
ENAMETOOLONG
rruga ishte shumë e gjatë.
ENOENT
O_CREAT nuk është caktuar dhe skedari me emrin nuk ekziston. Ose, një komponent directory në pathname nuk ekziston ose është një lidhje simbolike varur.
ENOTDIR
Një komponent i përdorur si një direktorium në pathname nuk është, në fakt, një direktori ose O_DIRECTORY është përcaktuar dhe pathname nuk ishte një direktori.
ENXIO
O_NONBLOCK | O_WRONLY është vendosur, skedari me emrin është një FIFO dhe asnjë proces nuk ka skedar të hapur për lexim. Ose, skedari është skedar i veçantë i pajisjes dhe nuk ekziston asnjë pajisje përkatëse.
ENODEV
pathname i referohet një skedari të veçantë pajisjesh dhe nuk ekziston asnjë pajisje përkatëse. (Ky është një bug kernel Linux - në këtë situatë duhet të kthehet ENXIO.)
EROFS
pathname i referohet një skedari në një sistem të vetëm për lexim dhe kërkohet shkrimi i qasjes.
ETXTBSY
pathname i referohet një imazhi ekzekutues i cili është duke u ekzekutuar dhe është kërkuar kërkesa për shkrim.
EFAULT
pikat e rrugës jashtë hapësirës suaj të adresave.
ELOOP
U zgjidhën shumë lidhje simbolike në zgjidhjen e emrit të rrugës ose O_NOFOLLOW u specifikua, por emri i rrugës ishte një lidhje simbolike.
ENOSPC
pathname do të krijohej, por pajisja që përmban pathname nuk ka vend për skedarin e ri.
ENOMEM
Kujtesa e pamjaftueshme e kernelit ishte në dispozicion.
EMFILE
Procesi tashmë ka numrin maksimal të dosjeve të hapura.
ENFILE
Kufiri i numrit të përgjithshëm të dosjeve të hapura në sistem është arritur.
Konform me
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Flamujt O_NOFOLLOW dhe O_DIRECTORY janë Linux- specifike. Mund të duhet të përcaktojë makro _GNU_SOURCE për të marrë përkufizimet e tyre.
kufizimet
Ka shumë keqtrajtime në protokollin që nënkupton NFS, duke ndikuar mes të tjerave O_SYNC dhe O_NDELAY .
POSIX siguron tre variante të ndryshme të I / O të sinkronizuar, që korrespondojnë me flamujt O_SYNC , O_DSYNC dhe O_RSYNC . Aktualisht (2.1.130) këto janë të gjitha sinonim nën Linux.