канспект
#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.