Linux Command Open бағдарламасын үйреніңіз

Синопсис

#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 синонимі.