Синопсис
#include << A HREF = "датотека: /usr/include/sys/types.h"> sys / types.h> # вклучување << A HREF = "датотека: /usr/include/sys/stat.h"> sys / stat.h> #include << А HREF = "датотека: /usr/include/fcntl.h"> fcntl.h> int отворен (const char * патека , int знамиња ); int отворен (const char * pathname , int знамиња , mode_t режим ); int креирање (const char * pathname , mode_t режим );Опис
Отворениот () системски повик linux команда се користи за претворање на патеката во дескриптор на датотека (мал, не-негативен цел број за употреба во подоцнежните I / O како со читање , запишување итн.). Кога повикот е успешен, дескрипторот на датотеката се враќа со најнискиот дескриптор на фајлот што во моментов не е отворен за процесот. Овој повик создава нова отворена датотека, која не е споделена со било кој друг процес. (Но, споделените отворени датотеки може да се појават преку системскиот повик fork (2). Новиот дескриптор на датотеката е поставен да остане отворен преку exec функции (видете fcntl (2)). Офсет на датотеката е поставен на почетокот на датотеката.
Параметарските знамиња се една од O_RDONLY , O_WRONLY или O_RDWR кои бараат отворање на датотеката само за читање, само за пишување или за читање / запишување, соодветно, побитно- или 'd со нула или повеќе од следново:
O_CREAT
Ако датотеката не постои, таа ќе биде креирана. Сопственикот (корисничко име) на датотеката е поставен на ефективната корисничка идентификација на процесот. Сопственоста на групата (идентификатор на група) е поставена или на ефективната идентификациска група на процесот или на идентификацијата на групата на матичниот директориум (во зависност од типот на датотечниот систем и опциите за монтирање и режимот на родилниот директориум, видете, на пример, монтирањето опции bsdgroups и sysvgroups на ext2 датотечниот систем, како што е опишано во монтирање (8)).
O_EXCL
Кога се користи со O_CREAT , ако датотеката веќе постои, тоа е грешка и отворањето ќе пропадне. Во овој контекст, постои симболичка врска, без оглед на тоа каде се истакнува нејзините поенти. O_EXCL е скршен на датотечни системи на NFS , програмите кои се потпираат на тоа за извршување задачи за заклучување ќе содржат тркачка состојба. Решението за вршење на заклучување на атомска датотека со помош на lockfile е да се создаде единствена датотека на истиот fs (на пример, инкорпорирање на име на host и pid), користете врска (2) за да направите врска до lockfile. Ако врската () се враќа 0, заклучувањето е успешно. Инаку, користете стат (2) на единствената датотека за да проверите дали бројот на врската е зголемен на 2, во кој случај и бравата е успешна.
O_NOCTTY
Ако патеката се однесува на терминален уред --- видете 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
Кога е можно, датотеката се отвара во режим што не е блокиран. Ниту отворените, ниту пак последователните операции на дескрипторот на датотеката што се враќа, ќе предизвикаат процесот на повикување да чека. За ракување со FIFOs (наречени цевки), видете, исто така, fifo (4). Овој режим не треба да има никаков ефект врз датотеки, различни од FIFO.
O_SYNC
Датотеката е отворена за синхрони I / O. Секоја write s на резултирачкиот дескриптор на датотека ќе го блокира процесот на повикување се додека податоците не бидат физички напишани на основниот хардвер. Сепак, видете ОГРАНИЧУВАЊА подолу.
O_NOFOLLOW
Ако патеката е симболичка врска, тогаш отвореното не успее. Ова е проширување на FreeBSD, кое беше додадено во Linux во верзија 2.1.126. Симболичките врски во претходните компоненти на патеката сè уште ќе се следат. Насловите од glibc 2.0.100 и подоцна вклучуваат дефиниција на ова знаме; кернелите пред 2.1.126 ќе го игнорираат ако се користат .
O_DIRECTORY
Ако патеката не е директориум, предизвика отворено да не успее. Ова знаменце е специфично за Линукс и беше додадено во кернелот верзија 2.1.126, за да се избегнат проблемите со одбивање на услуга ако opendir (3) се повикува на FIFO или лента уред, но не треба да се користи надвор од спроведувањето на opendir .
O_DIRECT
Обидете се да ги минимизирате кеш ефектите на I / O до и од оваа датотека. Општо земено ова ќе ја деградира перформансата, но е корисно во посебни ситуации, како на пример кога апликациите го прават своето кеширање. Датотеката I / O се прави директно во / од корисничките простори. I / O е синхронизиран, т.е. при завршувањето на системскиот повик (2) или write (2), се гарантира дека податоците се пренесени. Големините на преносот и усогласувањето на корисничкиот тампон и офсет на датотеката мора да бидат множители на големината на логичкиот блок на датотечниот систем.
Ова знаме е поддржано на голем број Unix-подобни системи; поддршка беше додадена под Линукс во кернелот верзија 2.4.10.
Семантички сличен интерфејс за блок уреди е опишан во сурови (8).
O_ASYNC
Генерирај сигнал (стандардно SIGIO, но ова може да се смени преку fcntl (2)) кога влезот или излезот станува можен на овој дескриптор на датотека. Оваа функција е достапна само за терминали, псевдо-терминали и приклучници. Види fcntl (2) за понатамошни детали.
O_LARGEFILE
На 32-битни системи кои го поддржуваат системот за големи датотеки, дозволете да ги отворите датотеките чии големини не можат да бидат претставени во 31 бит.
Некои од овие опционални знамиња може да се сменат со користење на fcntl откако датотеката е отворена.
Аргументалниот режим ги одредува дозволите што треба да се користат во случај да се создаде нова датотека. Тој е модифициран со умаска на процесот на вообичаен начин: дозволите на креираната датотека се (мод & ~ 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
Други имаат прочитано, пишуваат и извршуваат дозвола
S_IROTH
Други имаат дозвола за читање
S_IWOTH
Други имаат дозвола за пишување
S_IXOTH
00001 други имаат дозвола за извршување
модот мора да биде назначен кога O_CREAT е во знаменцата , и се игнорира поинаку.
creat е еквивалентно да се отвори со знамиња еднакви на O_CREAT | O_WRONLY | O_TRUNC .
ВРАЌАЊЕ ВРЕДНОСТ
отворен и создаден го враќа новиот дескриптор на датотеката, или -1 ако се појави грешка (во кој случај, errno е поставено соодветно). Забележете дека отворот може да ги отвори специјалните датотеки на уредот, но создавањето не може да ги создаде - наместо тоа, користете mknod (2).
На NFS датотечни системи со овозможено UID мапирање, отворен може да врати дескриптор на датотека, но на пример, барањата за читање (2) се одбиваат со EACCES . Ова е затоа што клиентот врши отворени со проверка на дозволите, но УПР мапирањето го извршува серверот по барања за читање и пишување.
Ако датотеката е новосоздадена, нејзините atime, ctime, mtime полиња се поставени на тековното време, а исто така се и ctime и mtime полињата на матичниот директориум. Инаку, ако датотеката е изменета поради знамето O_TRUNC, нејзините ctime и mtime полиња се поставени на тековното време.
Грешки
EEXIST
патеката веќе постои и се користат O_CREAT и O_EXCL .
EISDIR
патеката се однесува на директориумот и писмото што се бара за пристап (односно, O_WRONLY или O_RDWR е поставено).
EACCES
Бараниот пристап до датотеката не е дозволен, или еден од директориумите во патеката не дозволува дозвола за пребарување (извршување), или датотеката сè уште не постои и не е дозволен пристап до записот за родителскиот директориум.
ENAMETOOLONG
патеката беше предолга.
ОНА
O_CREAT не е поставен и именуваната датотека не постои. Или, компонентата на директориумот во патеката не постои или е симболичка врска која виси.
ENOTDIR
Компонентата што се користи како директориум во патеката не е, всушност, директориум, или O_DIRECTORY е наведен и патеката не беше директориум.
ENXIO
O_NONBLOCK | O_WRONLY е поставен, именуваната датотека е FIFO и ниеден процес нема отворена датотека за читање. Или, датотеката е специјална датотека за уредот и не постои соодветен уред.
ENODEV
патеката се однесува на специјална датотека за уред и не постои соодветен уред. (Ова е бубачка на Linux кернел - во оваа ситуација ENXIO мора да се врати.)
EROFS
патеката се однесува на датотека во датотечниот систем само за читање и е побаран пристап за запишување.
ETXTBSY
патеката се однесува на извршна слика која во моментов се извршува и бараше пристап за запишување.
EFAULT
патеката поени надвор од вашиот достапен адресен простор.
ELOOP
Преостанати симболички врски се сретнуваат при решавањето на патеката , или O_NOFOLLOW беше назначен, но патеката беше симболичка врска.
ENOSPC
патеката требаше да се креира, но уредот што содржи патека нема простор за новата датотека.
ENOMEM
Достапна е недоволна меморија на јадрото.
ЕМФИЛ
Процесот веќе го има максималниот број на датотеки отворени.
ENFILE
Достигнато е ограничување на вкупниот број на датотеки отворени на системот.
Во согласност со
SVr4, SVID, POSIX, X / OPEN, BSD 4.3 Заштитените знаци O_NOFOLLOW и O_DIRECTORY се Linux- специфични. Можеби мора да се дефинира макрото _GNU_SOURCE за да се добијат нивните дефиниции.
Ограничувања
Постојат многу несовршености во протоколот кои се подложни на NFS, што влијае меѓу другите O_SYNC и O_NDELAY .
POSIX обезбедува три различни варијанти на синхронизиран I / O, што одговара на знамињата O_SYNC , O_DSYNC и O_RSYNC . Во моментов (2.1.130) овие се сите синоними под Linux.