Вывучаюць Linux Command Open

канспект

#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 адкрытым (Const сімвал * шлях, Int сцягі); ИНТ адкрытым (Const сімвал * шлях, Int сцягі, рэжым mode_t); INT Creat (Const сімвал * шлях да файла, рэжым mode_t);

апісанне

Адкрыты () сістэмны выклік Linux каманда выкарыстоўваецца для пераўтварэння імя шляху ў дэскрыптар файла (невялікае, неадмоўнае цэлы лік для выкарыстання ў наступных ўводу / высновы , як і чытанне, запіс і г.д.). Калі выклік паспяховы, то файл дэскрыптар вяртаецца Віль самага нізкім дэскрыптар файла ў цяперашні час не адкрыты для працэсу. Гэты выклік стварае новы адкрыты файл, не выкарыстоўваецца сумесна з любым іншым працэсам. (Але агульныя адкрытыя файлы могуць узнікнуць праз відэлец (2) сістэмны выклік.) Новы дэскрыптар файла будзе заставацца адкрытым пры запускаюць функцый (гл Fcntl (2)). Файл зрушэння усталёўваецца ў пачатак файла.

Сцягі параметраў з'яўляецца адным з O_RDONLY, O_WRONLY або O_RDWR, якiя патрабуюць адкрыццё файла толькі для чытання, запісы або толькі для чытання / запісы, адпаведна, bitwise- або «d з нулём або больш з наступных дзеянняў :

O_CREAT

Калі файл не існуе, ён будзе створаны. Уладальнік (ідэнтыфікатар карыстальніка) файла усталёўваецца на эфектыўны ідэнтыфікатар карыстальніка працэсу. Уласнасці (група ID) усталёўваецца альбо для эфектыўнага ідэнтыфікатара групы працэсу або групы ID бацькоўскага каталога (у залежнасці ад тыпу файлавай сістэмы і опцыі мантавання і рэжыму бацькоўскага каталога, см, напрыклад, мацаванне варыянты bsdgroups і sysvgroups файлавай сістэмы ext2, як апісана ў трымальніку (8)).

O_EXCL

Пры выкарыстанні O_CREAT, калі файл ужо існуе , то ён з'яўляецца памылкай і адкрыты не атрымаецца. У гэтым кантэксце знакавая спасылка існуе, незалежна ад таго, дзе яго вызначае. O_EXCL разбіваецца на файлавых сістэмах NFS , праграмы , якія належаць на яго для выканання блакавальных задач будзе ўтрымліваць стан гонкі. Рашэнне для выканання атамарна блакавання файлаў з выкарыстаннем локировок каб стварыць унікальны файл на адзін і той жа ФС (напрыклад, уключаючы імя хост і PID), выкарыстоўвайце спасылку (2) , каб зрабіць спасылку на файл блякаваньне. Калі спасылка () вяртае 0, блакіроўка паспяховая. У адваротным выпадку, выкарыстанне стат (2) на унікальны файл , каб праверыць , калі колькасць спасылак павялічылася да 2, у гэтым выпадку блакаванне таксама паспяховая.

O_NOCTTY

Калі шлях да файла ставіцца да тэрмінальных прылад --- см тэрмінал (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

Калі гэта магчыма, файл адчынены ў рэжыме без блакавання. Ні адкрытым , ні любыя наступныя аперацыі на файлавы дэскрыптар , які вяртаецца выкліча які выклікае працэс чакаць. Для апрацоўкі FIFOs (названыя трубы), см таксама ФИФО (4). Гэты рэжым не павінен мець ніякага ўплыву на іншых, чым FIFOs файлаў.

O_SYNC

Файл адкрываецца ў рэжыме сінхроннага ўводу / высновы. Любая запіс s на выніковым дэскрыптар файла будзе блакаваць які выклікае працэс , пакуль звесткі не будуць фізічна запісаныя з базавым апаратным забеспячэннем. См АБМЕЖАВАННЯЎ ніжэй, хоць.

O_NOFOLLOW

Калі шлях з'яўляецца сімвалічнай спасылкай, то адкрыць файл не ўдалося. Гэта пашырэнне FreeBSD, якое было дададзена ў Linux у версіі 2.1.126. Сімвалічныя спасылкі ў папярэдніх кампанентаў імя будуць прытрымлівацца. Загалоўкі з GLibC 2.0.100 і пазней ўключыць вызначэнне гэтага сцяга; Ядра да 2.1.126 будзе ігнараваць яго , калі выкарыстоўваецца.

O_DIRECTORY

Калі шлях не з'яўляецца каталогам, адкрытай на правал. Гэты сцяг Linux-канкрэтныя, і быў дададзены ў ядро версіі 2.1.126, каб пазбегнуць адмовы ў абслугоўванні праблемы , калі opendir (3) называецца на FIFO або істужачнага прылады, але не варта выкарыстоўваць па-за рэалізацыі opendir ,

O_DIRECT

Паспрабуйце звесці да мінімуму кэш эфектаў ўводу / высновы і з гэтага файла. У цэлым гэта прывядзе да пагаршэння прадукцыйнасці, але гэта карысна ў асаблівых выпадках, напрыклад, калі прыкладання робяць сваё ўласнае кэшаванне. Файл уводу / высновы ажыццяўляецца непасрэдна ў / з карыстацкай прасторы буфераў. Ўводу / вываду з'яўляецца сінхронным, гэта значыць, пры завяршэнні чытання (2) або запісы (2) сістэмны выклік, дадзеныя гарантавана былі перададзеныя. Памеры перадачы, а выраўноўванне буфера карыстальніка і файла зрушэння ўсе павінны быць кратныя лагічнага памеру блока файлавай сістэмы.
Гэты сцяг падтрымліваецца на некалькіх Unix-падобных сістэм; была дададзеная падтрымка пад Linux ў ядры версіі 2.4.10.
Семантычна падобны інтэрфейс для блокавых прылад апісаны ў сыры (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 ў сцягах, і ігнаруецца ў адваротным выпадку.

Creat эквівалентна адкрыць са сцягамі , роўнымі O_CREAT | O_WRONLY | O_TRUNC.

Зварот КОШТУ

адкрываць і CREAT вяртае новы дэскрыптар файла, або -1 , калі адбылася памылка (у гэтым выпадку, ERRNO устанаўліваецца адпаведным чынам ). Звярніце ўвагу , што адкрыты можа адкрыць спецыяльныя файлы прылад, але Creat не можа ствараць іх - выкарыстоўваць MKNOD (2) замест гэтага.

На файлавых сістэмах NFS з адлюстраваннем UID уключаны, адкрыйце можа вярнуць файлавы дэскрыптар , але , напрыклад , чытанне (2) запыты адрокся ён EACCES. Гэта адбываецца таму , што кліент выконвае адкрытым шляхам праверкі правоў доступу, але адлюстраванне UID выконваецца сервер на чытанне і запіс запытаў.

Калі файл ствараецца зноўку, яго ATIME, CTime, поля часу зменаў ўсталёўваюцца ў бягучы час, і таму з'яўляюцца CTIME і часу змены поля бацькоўскага каталога. У адваротным выпадку, калі файл быў зменены з-за сцяг O_TRUNC, яго CTIME і час змянення поля ўсталёўваюцца ў бягучы час.

памылкі

EEXIST

шлях ужо існуе , і былі выкарыстаны O_CREAT і O_EXCL.

EISDIR

шлях ставіцца да каталога і доступу да запытанага мае на ўвазе запіс (гэта значыць, O_WRONLY або O_RDWR ўсталяваны).

EACCES

Запытаны доступ да файла ня вырашаны, або адзін з каталогаў у шляхавым імя не дазваляюць пошук (выкананне) дазволаў, або файл яшчэ не існуе , і доступ да бацькоўскага каталогу пісаць не дапускаецца.

ENAMETOOLONG

шлях быў занадта доўгім.

ENOENT

O_CREAT не ўстаноўлены і правераны файл не існуе. Або, кампанент каталога ў шляху не існуе або з'яўляецца вісячай сімвалічнай спасылкай.

ENOTDIR

Кампанент , які выкарыстоўваецца як каталог ў імя шляху не з'яўляецца, па сутнасці, каталог або O_DIRECTORY быў паказаны і шлях да файла не з'яўляецца каталогам.

ENXIO

O_NONBLOCK | O_WRONLY усталяваны, правераны файл мае змест FIFO і ні адзін працэс не мае файл адкрыты для чытання. Або, файл ўяўляе сабой адмысловы файл прылады і няма адпаведнага прылады не існуе.

ENODEV

шлях да файла ставіцца да прылады спецыяльны файл і няма адпаведнага прылады не існуе. (Гэта ядро ​​Linux памылка - у гэтай сітуацыі ENXIO павінна быць вернутая.)

EROFS

шлях ставіцца да файла ў файлавай сістэме толькі для чытання і запісы доступу запытвалі.

ETXTBSY

шлях да файла ставіцца да выкананага вобразу , які ў цяперашні час выконваецца і доступ на запіс быў запытаны.

EFAULT

імя шляху паказвае за межы даступнага адраснай прасторы.

ELOOP

Занадта шмат сімвалічных спасылак сустракаюцца ў дазваляльнага імя шляху, або O_NOFOLLOW быў паказаны , але дарога была сімвалічнай спасылкай.

ENOSPC

шлях павінен быў быць створаны , але прылада , якое змяшчае шлях да файла не мае месца для новага файла.

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. У цяперашні час (2.1.130) гэта ўсё сінонімы пад Linux.