Синопсис
#include «A HREF =» file: /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 жалаулар ); int ашық (const char * pathname , int жалаулары , mode_t режимі ); int creat (const char * pathname , mode_t режимі );Сипаттама
Open () жүйелік қоңырау командасы linux файлын файлдың дескрипторына (келесі I / O-де оқу , жазу және т.б. сияқты пайдалану үшін шағын, теріс емес бүтін санға) түрлендіру үшін пайдаланылады. Қоңырау сәтті болғанда, файлдың дескрипторы осы процесс үшін ашық емес ең төменгі файлдық дескриптор болып табылады. Бұл қоңырау кез келген басқа процесте ортақ пайдаланылмайтын жаңа ашық файл жасайды. (Бірақ ашық файлдар аралық (2) жүйелік қоңырау арқылы пайда болуы мүмкін). Жаңа файл дескрипторы exec функциялары бойынша ашық қалады ( fcntl (2) қараңыз). File offset файлдың басына орнатылған.
Параметрлердің жалаулары - O_RDONLY , O_WRONLY немесе O_RDWR бірі, файлды тек оқуға арналған, жазу немесе оқу / жазу, тиісінше, битопластты немесе нөл немесе төмендегілердің көпшілігін ашуды талап етеді:
O_CREAT
Егер файл жоқ болса, ол құрылады. Файлдың иесі (пайдаланушы идентификаторы) процестің тиімді идентификаторына орнатылған. Топтық иелену (топтық идентификатор) процестің тиімді топтық идентификаторына немесе ата-аналық каталогтың топтық идентификаторына орнатылады (файлдық жүйе түріне және орнатылым параметрлеріне және тектік каталогтың режиміне байланысты, мысалы, опциялар bsdgroups және ext2 файлдық жүйенің sysvgroups , mount (8)).
O_EXCL
O_CREAT көмегімен қолданылғанда, файл бар болса қате және ашық болады. Бұл тұрғыда оның қай жерде екеніне қарамастан, символикалық байланыс бар. O_EXCL NFS файлдық жүйелерінде бұзылған, бұған құлыптау тапсырмаларын орындау үшін оған негізделген бағдарламалар жарыс жағдайын қамтиды. Бекіту файлын қолдану арқылы атомдық файлды бұғаттауды шешу үшін бірдей fs файлында (мысалы, хост атауы мен pid) бірегей файл жасау, lockfile сілтемесін жасау үшін сілтемесін (2) пайдаланыңыз. Сілтеме () 0 қайтарса, құлыптау сәтті болады. Олай болмаған жағдайда, статистиканы (2) бірегей файлда қосылымның санын 2-ге жоғарылағанын тексеріңіз, бұл жағдайда құлыптау сәтті болады.
O_NOCTTY
Егер жолдың атауы terminal құрылғысына жатса, --- tty (4) --- бұл процестің біреуі болмаса да процестің басқарушы терминалы болмайды.
O_TRUNC
Егер файл бар болса және қалыпты файл болса және ашық режим жазуға мүмкіндік береді (мысалы, O_RDWR немесе O_WRONLY), ол ұзындығына дейін қысқартылады. Егер файл FIFO немесе терминал құрылғының файлы болса, O_TRUNC жалауы еленбейді. Олай болмаған жағдайда O_TRUNC әсері анықталмаған. (Көптеген Linux нұсқаларында ол еленбейді, басқа нұсқаларда ол қатені қайтарады.)
O_APPEND
Файл қосу режимінде ашылады. Әрбір жазудан бұрын, файлдың көрсеткіші файлдың соңында орналасқан, мысалы lseek . O_APPEND файл бірден бірнеше файлға деректерді бірден қосқанда, NFS файлдық жүйелерінде бүлінген файлдарға әкелуі мүмкін. Себебі NFS файлға қосылымды қолдамайды, сондықтан клиент ядросы оны жарнамалау жағдайынсыз жасай алмайды.
O_NONBLOCK немесе O_NDELAY
Мүмкіндігінше файл файлды блоктау режимінде ашылады. Қайтарылмайтын файлдық дескриптордағы ашық немесе кез келген басқа әрекеттер қоңырау процесінің күтуіне әкеледі. FIFO-ді (аталатын құбырларды) өңдеу үшін, сондай-ақ fifo (4) қараңыз. Бұл режим FIFO басқа файлдарға әсер етпеуі керек.
O_SYNC
Файл синхронды енгізу / шығару үшін ашылды. Алынған файлдың дескрипторындағы кез-келген жазбалар деректерді негізгі аппаратқа физикалық түрде жазылғанша қоңырау процесін тоқтатады. Бірақ, төменде көрсетілген ШЕКТЕУЛЕРДІ қараңыз.
O_NOFOLLOW
Егер жол аты символдық сілтеме болса, онда ашық болады. Бұл 2.1.126 нұсқасында Linux жүйесіне қосылған FreeBSD кеңейтімі. Жолдың ескі құрамдастарындағы символдық сілтемелер әлі де сақталады. Glibc 2.0.100 және одан кейінгі тақырыптар осы жалаудың анықтамасын қамтиды; 2.1.126 дейін ядро оны пайдаланбайды .
O_DIRECTORY
Егер жол аты каталог болмаса, ашық болуын тудырады. Бұл жалау Linux-ға тән және егер opendir (3) FIFO немесе таспалы құрылғыда шақырылған болса, қызметтен бас тарту мәселелерін болдырмау үшін, 2.1.126 ядросы нұсқасына қосылған, бірақ opendir .
O_DIRECT
I / O кэш әсерлерін осы файлдан және осы файлдан азайтуға тырысыңыз. Жалпы бұл өнімділікті төмендетеді, бірақ ол арнайы жағдайларда, мысалы, қосымшалар өздерінің кэштелуін жасайды. Файлды енгізу / шығару пайдаланушыға арналған бос орын буферіне / тікелей орындалады. I / O синхронды, яғни read (2) немесе write (2) жүйелік қоңырауды аяқтаған кезде, деректер берілді деп кепілдік беріледі. Тасымалдау өлшемдері және пайдаланушы буферін және файлды ығысуын теңестіру файлдық жүйенің логикалық блоктық өлшемінің бірнеше болуы керек.
Бұл жалауша Unix ұқсас жүйеде қолдайды; Linux 2.4.10 нұсқасында ядроға қолдау көрсетілді.
Блок құрылғыларына арналған семантикалық ұқсас интерфейс шикізатта сипатталған (8).
O_ASYNC
Сигналды жасаңыз (Әдепкі бойынша SIGIO, бірақ fcntl (2) арқылы өзгертілуі мүмкін), егер бұл файлдың дескрипторында енгізу немесе шығару мүмкін болса. Бұл мүмкіндік тек терминалдар, жалған терминалдар және розеткалар үшін қол жетімді. Қосымша ақпарат алу үшін fcntl (2) бөлімін қараңыз.
O_LARGEFILE
Үлкен файлдық жүйені қолдайтын 32 биттік жүйелерде мөлшері 31 битте ашылмайтын файлдарды ашуға мүмкіндік береді.
Кейбір қосымша опцияларды файлды ашқаннан кейін fcntl арқылы өзгертуге болады.
Аргума режимі жаңа файл жасаған жағдайда пайдалануға рұқсат береді. Процестің үрдісі әдеттегі тәртіпте өзгертіледі: құрылған файлдың рұқсаттары (mode & 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 жалаушаларда болғанда көрсетіледі және басқасы еленбейді.
CREATE O_CREAT | O_WRONLY | O_TRUNC тең жалаулармен ашылғанға тең.
RETURN VALUE
ашу және жасау жаңа файлды дескрипторды қайтарады, немесе қате пайда болған жағдайда -1 (бұл жағдайда errno дұрыс орнатылған). Ашық құрылғыға арнайы файлдарды ашуға болады, бірақ оларды жасау мүмкін емес - орнына mknod (2) пайдаланыңыз.
UID салыстыру мүмкіндігі бар NFS файлдық жүйелерінде ашылған файлды дескриптор қайтара алады, бірақ мысалы, оқу (2) сұрауларына EACCES арқылы тыйым салынған. Бұл клиент рұқсаттарды тексеру арқылы ашық түрде жұмыс істейді , бірақ UID картасын оқу және жазу сұраулары бойынша сервер орындалады.
Егер файл жаңадан құрылған болса, оның атмосферасы, ctime, mtime өрістері ағымдық уақытқа орнатылады және ата каталогтың ctime және mtime өрістері. Әйтпесе, файл O_TRUNC туы себебінен өзгертілсе, оның ctime және mtime өрістері ағымдағы уақытқа орнатылады.
Қателер
EEXIST
pathname бұрыннан бар және O_CREAT және O_EXCL пайдаланылды.
EISDIR
pathname каталогқа сілтеме жасайды және сұралған жазбаша жазбамен (яғни, O_WRONLY немесе O_RDWR орнатылған) қол жеткізіледі.
EACCES
Файлға сұратылған кіруге рұқсат берілмейді немесе pathname каталогтарындағы біреуі іздеуге (орындау) рұқсат бермеді немесе файл әлі жоқ және ата каталогқа қатынауға рұқсат берілмейді.
ENAMETOOLONG
жол атауы тым ұзақ болды.
ENOENT
O_CREAT орнатылмаған және аталған файл жоқ. Немесе, pathname ішіндегі каталог құрамдасы болмайды немесе символдық сілтеме болып табылады.
ENOTDIR
Жол атауында каталог ретінде пайдаланылатын компонент шын мәнінде каталог немесе O_DIRECTORY көрсетілмеген және pathname каталог болмады.
ENXIO
O_NONBLOCK | O_WRONLY орнатылған, аталған файл FIFO және ешқандай процесс оқуға арналған файл жоқ. Немесе файл арнайы құрылғы болып табылады және тиісті құрылғы жоқ.
ENODEV
pathname құрылғының арнайы файлына сілтеме жасайды және тиісті құрылғы жоқ. (Бұл Linux ядросы қатесі - бұл жағдайда ENXIO қайтарылуы керек.)
EROFS
pathname тек оқуға арналған файлдық жүйеде файлға сілтеме жасайды және жазуға рұқсат сұралды.
ETXTBSY
pathname қазіргі уақытта орындалатын орындалатын кескінге қатысты және жазуға рұқсат сұралған.
EFAULT
қол жетімді мекенжай кеңістігінің сыртындағы жол нүктелерін көрсетеді.
ELOOP
Жолдың атын шешу кезінде тым көп символдық сілтемелер кездеседі немесе O_NOFOLLOW көрсетілді, бірақ жол аты символдық байланыс болатын.
ENOSPC
pathname жасалуы керек, бірақ pathname бар құрылғы жаңа файл үшін орын жоқ.
ENOMEM
Жеткіліксіз ядро жады бар.
EMFILE
Процестің файлдардың ең көп саны ашық.
ENFILE
Жүйеде ашылған файлдардың жалпы санына шектеу қойылды.
Сәйкес келетін
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 O_NOFOLLOW және O_DIRECTORY жалаулары Linux-ерекше болып табылады. Өз анықтамаларын алу үшін _GNU_SOURCE макросын анықтау қажет болуы мүмкін.
Шектеулер
NFS негізіндегі хаттамаға көптеген O_SYNC және O_NDELAY сияқты көптеген инфекциондықтар бар .
POSIX O_SYNC , O_DSYNC және O_RSYNC жалауларына сәйкес синхрондалған I / O нұсқаларының үш нұсқасын ұсынады. Қазіргі уақытта (2.1.130) бұл барлық Linux синонимі.