Իմացեք Linux հրամանատարության բացը

Սինոփսիս

#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- ում: