Запознајте ја командата Linux Open

Синопсис

#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.