Научете командата Linux 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 = "file: /usr/include/fcntl.h"> fcntl.h> int open (const char * pathname , int flags ); int open (константа char * пътя , int флаговете , mode_t режим ); int creat (const char * пътно име , режим mode_t );

описание

Командата open () за системно обаждане на linux се използва за преобразуване на името на пътя в дескриптор на файла (малко, неотрицателно цяло число, което се използва в следващите входно / изходни операции, както при четене , писане и т.н.). Когато повикването е успешно, файловият дескриптор се връща, ще бъде най-ниският файлов дескриптор, който понастоящем не е отворен за процеса. Това повикване създава нов отворен файл, който не се споделя с друг процес. (Но споделените отворени файлове могат да възникнат чрез системното повикване на вилицата (2).) Нов файлов дескриптор е настроен да остава отворен за функциите на exec (виж fcntl (2)). Отместването на файла е зададено в началото на файла.

Флаговете на параметрите са един от параметрите O_RDONLY , O_WRONLY или O_RDWR, които изискват отваряне на файла само за четене, само за запис или четене / запис, съответно, по бит- или "d с нула или повече от следните стойности:

O_CREAT

Ако файлът не съществува, той ще бъде създаден. Собственикът (потребителски идентификатор) на файла е настроен на ефективния потребителски идентификатор на процеса. Груповата собственост (групова идентификация) се определя или на ефективния идентификационен номер на групата на процеса, или на идентификационния номер на груповата директория (в зависимост от типа на файловата система и опциите за монтаж и режима на родителската директория, вижте например монтажа опциите bsdgroups и sysvgroups на ext2 файловата система, както е описано в mount (8)).

O_EXCL

Когато се използва с O_CREAT , ако файлът вече съществува, това е грешка и отварянето ще се провали. В този контекст съществува символична връзка, независимо от това къде се отнасят. O_EXCL е разбит на файлови системи на NFS , програми, които разчитат на него за извършване на заключващи задачи, ще съдържат условие за състезание. Решението за извършване на заключване на атомни файлове, използвайки заключващ файл, е да се създаде уникален файл на един и същ fs (например, включващ име на хост и pid), използвайте линк (2), за да направите връзка към заключващия файл. Ако връзката () връща 0, заключването е успешно. В противен случай използвайте stat (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

Когато е възможно, файлът се отваря в режим без блокиране. Нито откритите, нито последващите операции върху дескриптора на файла, който се връща, ще доведат до изчакване на процеса на обаждане. За обработката на FIFO (наречени тръби) вижте и FIFO (4). Този режим не е необходим за други файлове освен FIFO.

O_SYNC

Файлът е отворен за синхронни I / O. Всяко записване на резултантния файлов дескриптор ще блокира процеса на повикване, докато данните бъдат физически написани на основния хардуер. Вижте ОГРАНИЧЕНИЯ по-долу.

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

Опитайте се да сведете до минимум ефекта на кеша на I / O към и от този файл. По принцип това ще влоши производителността, но е полезно в специални ситуации, например когато заявките правят собствено кеширане. Файловите I / O се изпълняват директно в / от буферите на потребителското пространство. I / O е синхронно, т.е. при завършване на системното повикване (2) или write (2), данните се гарантират, че са прехвърлени. Размерите за прехвърляне и подравняването на потребителския буфер и отместването на файла трябва да са кратни на размера на логическия блок на файловата система.
Този флаг се поддържа на редица Unix-подобни системи; под Linux беше добавена поддръжка в ядрото версия 2.4.10.
Семантично подобен интерфейс за блокови устройства е описан в необработен (8).

O_ASYNC

Генерирайте сигнал (по подразбиране SIGIO, но това може да се промени чрез fcntl (2)), когато в този дескриптор на файла е възможно въвеждане или изход. Тази функция е налице само за терминали, псевдо терминали и гнезда. Вижте fcntl (2) за повече подробности.

O_LARGEFILE

На 32-битовите системи, поддържащи системата Large Files, позволете да се отворят файлове, чиито размери не могат да бъдат представени в 31 бита.

Някои от тези незадължителни флагове могат да се променят с помощта на fcntl след отварянето на файла.

Режимът за аргументи определя разрешенията за използване в случай на създаване на нов файл. Той се модифицира от метода umask по обичайния начин: разрешенията на създадения файл са (mode & ~ umask) . Обърнете внимание, че този режим се отнася само за бъдещи достъп до новосъздадения файл; отвореното повикване, което създава файл само за четене, може да върне дескриптор на файла за четене / запис.

За режима са предвидени следните символни константи:

S_IRWXU

00700 потребител (собственик на файл) е прочел, пише и изпълнява разрешение

S_IRUSR (S_IREAD)

00400 потребител има разрешение за четене

S_IWUSR (S_IWRITE)

Потребителят има разрешение за писане

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 .

ВРЪЩАНЕ НА СТОЙНОСТТА

отворете и създайте връщане на новия файлов дескриптор или -1, ако възникне грешка (в този случай грешката е настроена правилно). Имайте предвид, че отворените могат да отварят специални файлове на устройството, но creat не може да ги създаде - вместо това използвайте mknod (2).

На файловите системи на NFS с активирано картографиране на UID, отвореното може да върне файлов дескриптор, но например исканията за четене (2) са отказани с EACCES . Това е така, защото клиентът се показва отворен, като проверява разрешенията, но картографирането на UID се изпълнява от сървъра при заявки за четене и писане.

Ако файлът е новосъздаден, неговите atime, ctime, mtime полета са настроени на текущото време, както и полетата ctime и mtime на основната директория. В противен случай, ако файлът се промени поради флага O_TRUNC, полетата му ctime и mtime са зададени на текущото време.

грешки

EEXIST

pathname вече съществува и са използвани O_CREAT и O_EXCL .

EISDIR

pathname се отнася до директория и изискваният достъп включва писане (т.е. O_WRONLY или O_RDWR е зададено).

EACCES

Заявеният достъп до файла не е разрешен или една от директорите в пътя не позволява разрешение за търсене (изпълнение) или файлът все още не съществува и достъпът за писане до родителската директория не е разрешен.

ENAMETOOLONG

пътят е твърде дълъг.

ENOENT

O_CREAT не е зададен и именият файл не съществува. Или директорията компонент в пътя не съществува или е висяща символична връзка.

ENOTDIR

Компонент, използван като директория в пътя , всъщност не е директория или е указано O_DIRECTORY и пътят не е директория.

ENXIO

O_NONBLOCK | O_WRONLY е настроен, името на файла е FIFO и няма процес, в който файлът е отворен за четене. Или, файлът е специален файл на устройството и няма съответстващо устройство.

ENODEV

pathname се отнася до специален файл на устройството и няма съответното устройство. (Това е грешка в ядрото на Linux - в тази ситуация ENXIO трябва да бъде върната.)

EROFS

pathname се отнася за файл в файлова система само за четене и е заявен достъп за запис.

ETXTBSY

pathname се отнася до изпълнимо изображение, което в момента се изпълнява и се изисква достъп за запис.

EFAULT

pathname точки извън вашето достъпно адресно пространство.

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 осигурява три различни варианта на синхронизирани I / O, съответстващи на флаговете O_SYNC , O_DSYNC и O_RSYNC . В момента (2.1.130) всички те са синоним на Linux.