Սինոփսիս
#include << A HREF = "ֆայլ: /usr/include/sys/types.h"> sys / types.h> #include << A HREF = "ֆայլ` /usr/include/sys/stat.h "> sys / stat.h> #include << A HREF = "ֆայլը` /usr/include/fcntl.h "> fcntl.h> int open (const char * pathname , int flags ); int open (const char * pathname , int դրոշներ , mode_t ռեժիմ ); int creat (const char * pathname, mode_t ռեժիմ );Նկարագրություն
Բաց () համակարգային զանգի linux հրամանը օգտագործվում է pathname- ի ֆայլի նկարագրիչի մեջ (փոքր, ոչ բացասական ամբողջական համար, հետագա I / O- ի օգտագործման համար, ինչպես կարդալ , գրել եւ այլն): Երբ զանգը հաջողված է, ֆայլի նկարագրիչը վերադարձնում է ամենացածր ֆայլի նկարագրությունը, որը ներկայումս բաց չէ գործընթացում: Այս զանգը ստեղծում է նոր բաց ֆայլ, որը չի տարածվում որեւէ այլ գործընթացի հետ: (Սակայն բացված ֆայլերը կարող են առաջանալ պատառաքաղի (2) համակարգի զանգի միջոցով): Նոր ֆայլի նկարագրությունը սահմանվում է բացված է exec գործառույթների միջեւ (տես fcntl (2)): Ֆայլի օֆսեթը սահմանվում է ֆայլի սկիզբը:
Պարամետրերի դրոշակները O_RDONLY , O_WRONLY կամ O_RDWR- ից մեկն է, որը պահանջում է բացել միայն կարդալու ֆայլը, գրել միայն կամ կարդալ / գրել, համապատասխանաբար, bitwise- ի կամ d:
O_CREAT
Եթե ֆայլը գոյություն չունի, այն կստեղծվի: Ֆայլի սեփականատերը (օգտվողի ID) սահմանվում է գործընթացի արդյունավետ օգտվողի ID- ն: Խմբի սեփականությունը (խմբի ID) սահմանվում է կամ գործընթացի արդյունավետ խմբային ID- ին կամ ծնողի գրացուցակի խմբի ID- ին (կախված ֆայլերի համակարգի տեսակից եւ տեղադրման ընտրանքներից եւ ծնողի դիրեկտորիայի ռեժիմից, տես, օրինակ, ընտրանքներ bsdgroups եւ ext2 ֆայլային համակարգի sysvgroups , ինչպես նկարագրված է լեռ (8)):
O_EXCL- ը
O_CREAT- ի հետ օգտագործվելիս, եթե ֆայլը արդեն գոյություն ունի, դա սխալ է, եւ բացը ձախողվի: Այս համատեքստում գոյություն ունի խորհրդանշական հղում, անկախ այն բանից, թե որտեղ է իր կետերը: O_EXCL- ը կոտրված է NFS ֆայլային համակարգերի վրա , այն ծրագրերը, որոնք ապավինում են այն բլոկավորման գործառույթների իրականացման համար, պարունակում են մրցավազքի վիճակը: Ատոմային ֆայլի կողպեքի օգտագործման լուծումը, օգտագործելով lockfile- ը, նույն fs- ի վրա ստեղծելու յուրօրինակ ֆայլ (օրինակ `hostname- ը եւ pid- ը), օգտագործեք հղումը (2), կողպեքին հղում կատարելու համար: Եթե հղումը () վերադարձնում է 0, կողպեքը հաջող է: Հակառակ դեպքում, օգտագործեք stat (2) եզակի ֆայլի վրա, ստուգելու համար, թե արդյոք դրա հղումների քանակը ավելացել է 2-ով, որի դեպքում կողպեքը նույնպես հաջող է:
O_NOCTTY
Եթե pathname- ը վերաբերում է տերմինալային սարքին --- տես tty (4) --- այն գործընթացների վերահսկման տերմինը չի դառնա, նույնիսկ եթե գործընթացը չունի:
O_TRUNC
Եթե ֆայլը արդեն գոյություն ունի եւ կանոնավոր ֆայլ է, եւ բաց ռեժիմը թույլ է տալիս գրել (այսինքն, O_RDWR կամ O_WRONLY), այն կկտրվի երկարությունը 0: Եթե ֆայլը FIFO կամ տերմինալ սարքի ֆայլ է, ապա O_TRUNC դրոշը անտեսվում է: Հակառակ դեպքում, O_TRUNC- ի ազդեցությունն անհայտ է: (Linux տարբերակներում այն անտեսվելու է, մյուս տարբերակներում էլ կվերադառնա սխալ):
O_APPEND
Ֆայլը բացվում է հավելվածի ռեժիմում: Նախքան յուրաքանչյուր գրելը , ֆայլի ցուցիչը տեղադրվում է ֆայլի վերջում, կարծես lseek- ով : O_APPEND- ը կարող է հանգեցնել NFS ֆայլային համակարգերի վրա կոռումպացված ֆայլերի, եթե մեկից ավելի գործընթացը միանգամից ֆայլը կցնում է ֆայլը: Դա այն է, որ NFS- ն չի աջակցում ֆայլի հավելվածին, այնպես որ հաճախորդի միջուկը պետք է կեղծել այն, ինչը չի կարող կատարվել առանց մրցավազքի վիճակի:
O_NONBLOCK կամ O_NDELAY
Հնարավորության դեպքում ֆայլը բացվում է ոչ արգելափակման ռեժիմում: Ոչ վերադարձված ֆայլի նկարագրիչի բաց եւ ոչ էլ հետագա գործողությունները կհանգեցնեն սպասարկման գործընթացին: FIFO- ների (անվանված խողովակները) մշակման համար տես նաեւ fifo (4): Այս ռեժիմը չպետք է որեւէ ազդեցություն ունենա FIFO- ի այլ ֆայլերի վրա:
O_SYNC
Ֆայլը բացվում է համաժամանակյա I / O- ի համար: Արդյունքում հայտնաբերված ֆայլի նկարագրության վրա գրված ցանկացած գրառում կդադարեցնի զանգահարելու գործընթացը, մինչեւ տվյալները ֆիզիկականորեն գրված լինեն հիմնական սարքավորման վրա: Տես, ստորեւ նշված ՍԱՀՄԱՆԱՓՈԽՈՒԹՅՈՒՆՆԵՐԸ:
O_NOFOLLOW
Եթե ճանապարհը խորհրդանշական հղում է, ապա բացը ձախողվում է: Սա FreeBSD ընդլայնում է, որը Linux- ին ավելացվել է 2.1.126 տարբերակում: Ուղղաթիռի նախորդ բաղադրիչներում սիմվոլիկ հղումները դեռ կհետեւեն: Թղթապանակներ glibc 2.0.100-ից եւ ավելի ուշ ներառում են այս դրոշի սահմանումը. կրկնօրինակները մինչեւ 2.1.126-ը անտեսեն այն, եթե օգտագործվեն :
O_DIRECTORY
Եթե pathname- ը գրացուցակ չէ, պատճառը բաց է: Այս դրոշը Linux- ի հատուկ է եւ ավելացվել է միջուկային տարբերակի 2.1.126-ում, որպեսզի չխոչընդոտեն սպասարկման խնդիրները, եթե opendir (3) կոչվում է FIFO կամ ժապավենային սարքի վրա, բայց չպետք է օգտագործվի opendir- ի .
O_DIRECT
Փորձեք նվազագույնի հասցնել I / O- ի քեշի հետեւանքները եւ այս ֆայլից: Ընդհանուր առմամբ սա կխաթարի կատարումը, բայց դա օգտակար է հատուկ իրավիճակներում, ինչպիսիք են, երբ ծրագրերը կատարում են իրենց սեփական caching: Ֆայլի I / O- ը կատարվում է անմիջապես / օգտագործողի տարածք բուֆերներից: I / O- ը համաժամանակյա է, այսինքն ` ընթերցված (2) կամ գրելու (2) համակարգային ավարտի ավարտին, տվյալների երաշխավորված է փոխանցվել: Փոխանցման չափերը եւ օգտագործողի բուֆերի եւ ֆայլի օֆսեթի հավասարումը պետք է լինեն բոլոր ֆայլերի տրամաբանական բլոկի չափի բազմապատկում:
Այս դրոշը աջակցվում է մի շարք Unix- ի նման համակարգերի վրա, աջակցությունը ավելացվել է Linux- ի ներքո Linux- ի 2.4.10 տարբերակով:
Բեւեռային սարքերի համար semantically նման ինտերֆեյսը նկարագրված է հում (8):
O_ASYNC
Ստեղծեք ազդանշան (SIGIO- ի լռելյայն, բայց դա կարող է փոխվել fcntl (2)) միջոցով, երբ մուտքագրման կամ թողարկումը հնարավոր է դառնում այս ֆայլի նկարագրության մեջ: Այս հատկությունը հասանելի է միայն տերմինալների, կեղծ տերմինալների եւ վարդակների համար: Տես fcntl (2) լրացուցիչ մանրամասների համար:
O_LARGEFILE
32-բիթանոց համակարգերում, որոնք աջակցում են Մեծ Ֆայլերի համակարգին, թույլ են տալիս ֆայլեր, որոնց չափերը չեն կարող ներկայացվել 31 բիթում:
Այս ընտրովի դրոշներից մի քանիսը կարող են փոփոխվել, օգտագործելով fcntl ֆայլի բացումից հետո:
Արգումենտ ռեժիմը սահմանում է նոր ֆայլ ստեղծելու դեպքում օգտագործման թույլտվությունները: Այն ձեւափոխվում է գործընթացի umask- ի կողմից սովորական ձեւով. Ստեղծված ֆայլի թույլտվությունները (ռեժիմ & umask) են : Նշենք, որ այս ռեժիմը վերաբերում է միայն նոր ստեղծված ֆայլի ապագա հասանելիությանը: Բաց զանգը, որը ստեղծում է միայն կարդալու ֆայլ, կարող է վերադարձնել կարդալու / գրելու ֆայլի նկարագրությունը:
Ռեժիմում ներկայացված են հետեւյալ խորհրդանշական հաստատունները.
S_IRWXU
00700 օգտվող (ֆայլի սեփականատերը) կարդացել է, գրել եւ կատարել թույլտվություն
S_IRUSR (S_IREAD)
00400 օգտվողը կարդացել է թույլտվությունը
S_IWUSR (S_IWRITE)
00200 օգտվողը գրել է թույլտվություն
S_IXUSR (S_IEXEC)
00100 օգտվողն իրականացնում է թույլտվություն
S_IRWXG
00070 խումբը կարդացել է, գրել եւ կատարել թույլտվություն
S_IRGRP
00040 խումբը կարդացել է թույլտվություն
S_IWGRP
00020 խումբը գրելու թույլտվություն ունի
S_IXGRP
00010 խումբը կատարում է թույլտվություն
S_IRWXO
00007 մարդ կարդացել է, գրել եւ կատարել թույլտվություն
S_IROTH- ը
00004 մարդ կարդացել է թույլտվությունը
S_IWOTH
00002 մարդ ունեն գրելու թույլտվություն
S_IXOTH
00001 այլ անձինք կատարել են թույլտվություն
ռեժիմը պետք է նշվի, երբ O_CREAT- ը դրոշի մեջ է եւ այլ կերպ անտեսվում է:
ստեղծագործությունը համարժեք բաց է դրոշներով, հավասար O_CREAT | O_WRONLY | O_TRUNC :
ՎԵՐԱԴԱՐՁԸ VALUE
բացեք եւ ստեղծեք նոր ֆայլի նկարագրությունը, կամ -1-ը, եթե սխալ տեղի է ունեցել (որի դեպքում errno- ն ճիշտ է սահմանված): Նշենք, որ բացը կարող է բացել սարքի հատուկ ֆայլերը, բայց ստեղծողը չի կարող ստեղծել այն, օգտագործեք mknod (2):
NFS ֆայլային համակարգերում UID քարտեզագրման հնարավորություն ընձեռվեց, բացը կարող է վերադարձնել ֆայլի նկարագրությունը, բայց, օրինակ, կարդալ (2) հարցումները մերժվում են EACCES- ի հետ : Դա պայմանավորված է այն պատճառով, որ հաճախորդը բացում է թույլտվությունները ստուգելու միջոցով, սակայն UID քարտեզագրում կատարվում է սերվերի կողմից կարդալու եւ գրելու հարցումներով:
Եթե ֆայլը նոր է ստեղծվել, նրա atime, ctime, mtime դաշտերը սահմանվում են ընթացիկ ժամանակահատվածում, եւ այդպիսին են նաեւ ծնողական գրացուցակի ctime եւ mtime դաշտերը: Հակառակ դեպքում, եթե ֆայլը փոփոխվում է O_TRUNC դրոշի պատճառով, դրա ctime եւ mtime դաշտերը սահմանվում են ընթացիկ ժամանակահատվածով:
Սխալներ
EEXIST
pathname արդեն գոյություն ունի եւ O_CREAT եւ O_EXCL օգտագործվել են:
EISDIR
pathname- ը վերաբերում է գրացուցակին եւ մուտքագրված խնդրանքին գրառմանը (այսինքն, O_WRONLY կամ O_RDWR- ը սահմանվում է):
EACCES- ը
Ֆայլի խնդրանքը թույլատրված չէ, կամ pathname- ի դիրեկտորիաներից մեկը թույլ չի տվել որոնում (իրականացնել) թույլտվություն, կամ ֆայլը դեռ գոյություն չունի եւ գրելու մուտք դեպի ծնողական գրացուցակը:
ENAMETOOLONG- ը
ուղին չափազանց երկար էր:
ՆՈՐ
O_CREAT- ը չի սահմանվել եւ նշված ֆայլը գոյություն չունի: Կամ էլ, ուղակի ուղեցույց բաղադրիչը գոյություն չունի կամ վառող խորհրդանշական հղում է:
ENOTDIR
Ուղեցույցում օգտագործված բաղադրիչը չէ, ըստ էության, գրացուցակը կամ O_DIRECTORY- ն է, եւ pathname- ը գրացուցակ չէր:
ENXIO
O_NONBLOCK | O_WRONLY- ը սահմանվում է, անունը ֆայլը FIFO է, եւ ֆայլը բաց չէ ընթերցելու համար: Կամ, ֆայլը սարքի հատուկ ֆայլ է եւ համապատասխան սարքը գոյություն չունի:
ENODEV- ը
pathname- ը վերաբերում է սարքի հատուկ ֆայլին եւ համապատասխան սարքի գոյություն չունի: (Սա Linux kernel bug է, այս իրավիճակում ENXIO- ը պետք է վերադարձվի):
EROFS- ը
pathname- ը վերաբերում է միայն կարդալու ֆայլերի համակարգում ֆայլին եւ գրելու հնարավորությունը:
ETXTBSY
pathname- ը վերաբերում է կատարվող պատկերին, որը ներկայումս կատարվում է եւ գրելու համար պահանջվում է:
ԷՖՖՈՒԼ
pathname կետերը մատչելի հասցեի տարածքից դուրս:
ELOOP- ը
Ուղիղի որոշման ընթացքում հանդիպում էին շատ խորհրդանշական հղումներ, կամ O_NOFOLLOW- ը որոշվել էր, բայց pathname- ը խորհրդանշական հղում էր:
ENOSPC
pathname- ը պետք է ստեղծվեր, բայց pathname պարունակող սարքը տեղ չունի նոր ֆայլի համար:
ENOMEM- ը
Անբավարար սերվերային հիշողություն հասանելի էր:
EMFILE- ը
Գործընթացը արդեն բաց է ֆայլերի առավելագույն քանակը:
ENFILE
Համակարգում բացված ֆայլերի ընդհանուր քանակը սահմանվել է:
Համապատասխանություն
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW եւ O_DIRECTORY դրոշները Linux- ի հատուկ են: Անհրաժեշտ է սահմանել _GNU_SOURCE մակրո, սահմանելու համար:
Սահմանափակումները
Կան բազմաթիվ infelicities NFS հիմքում արձանագրության մեջ, ազդում է մյուսների O_SYNC եւ O_NDELAY :
POSIX- ը նախատեսում է երեք տարբեր տիպի համաժամեցված I / O տարբերակներ, որոնք համապատասխանում են O_SYNC , O_DSYNC եւ O_RSYNC դրոշներին : Ներկայումս (2.1.130) դրանք բոլորը հոմանիշ են Linux- ում: