Mësoni hapur Command Linux

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.