Отворете, създайте - отворете и по желание създайте файл или устройство - Linux документация
ИМЕотваряне, създаване - отваряне и, ако е възможно, създаване на файл или устройство
СИНТАКСИС#включване #включване #включване
int open(const char *pathname, int флагове); int open(const char *pathname, int флагове, mode_t mode); int creat(const char *pathname, mode_t mode);ОПИСАНИЕИзвикването open() се използва за преобразуване на пътя на файла във файлов дескриптор (малко неотрицателно цяло число което се използва с извиквания за четене, запис и т.н. при следващи I/O). Ако системното извикване е успешно, върнатият файлов дескриптор е най-малкият файлов дескриптор, който все още не е бил отворен от процеса . Резултатът от това извикване е нов отворен файл, който не се споделя от никакви процеси (споделени отворени файлове могат да възникнат, когато се изпрати системното извикване fork(2). Новият манипулатор на файла ще остане отворен по време на изпълнението на exec(2) (вижте fcntl(2)). Указателят е поставен в началото на файла. Параметърът за флагове е флаговете O_RDONLY, O_WRONLY или O_RDWR, които отварят файлове само за четене, само за запис и само за четене и запис, които се събират с помощта на побитова операция ИЛИ от стойности като:
O_CREAT (Ако файлът не съществува, той ще бъде създаден. Собственикът (потребителски ИД) на файла е зададен на ефективния потребителски ИД на процеса. Група (Групов ИД) е настроен или на стойността на ефективния групов ИД на процеса, или на стойността на груповия ИД на родителската директория (в зависимост от файловия системен тип, параметримонтиране и режим на родителската директория, вижте например опциите за монтиране bsdgroups и sysvgroups на файловата система ext2 , както е описано в ръководството mount(8).);
O_EXCL (Ако се използва във връзка с O_CREAT, тогава ако има вече създаден файл, отвореното повикване ще бъде неуспешно с грешка. В това състояние, ако символната връзка съществува, не се обръща внимание към какво сочи.);
O_EXCL (Това не работи на NFS файлови системи и програмите, които използват този флаг за заключване, ще програмират "състезателно състояние". Решение за атомарно заключване на файл: създайте файл с уникално име на същата файлова система (това име може да съдържа например името на машината и ID на процеса), като използвате link(2) за създаване на връзка към заключващия файл. Ако link() върне стойност 0, тогава заключването е било успешно. В противен случай използвайте stat(2), за да проверите дали броят на препратките към уникалния файл се е увеличил до две. Това също означава, че заключването е било успешно);
O_NOCTTY (ако името на пътя сочи към крайно устройство -- вижте tty(4) -- то няма да стане терминал за контрол на процеса дори ако процесът няма такъв);
O_TRUNC (Ако файлът вече съществува, той е обикновен файл и режимът позволява запис в този файл (т.е. зададен на O_RDWR или O_WRONLY), тогава неговата дължина ще бъде съкратена до нула. Ако файлът е FIFO канал или терминално устройство, тогава този флаг се игнорира. В противен случай ефектът от O_TRUNC флага е не е дефинирано. погрешно, грешка се връща в други версии.));
O_APPEND (Файлът се отваря в режим на добавяне. Преди всяка операция за записуказателят на файла ще се настрои в края на файла, сякаш използва lseek); O_APPEND (може да повреди файлове в NFS система, ако множество процеси добавят данни към един и същ файл едновременно. Това е така, защото NFS не поддържа добавяне към файл с данни, така че ядрото на клиентската машина трябва да емулира тази поддръжка);
O_NONBLOCK или O_NDELAY (Файлът се отваря в не- блокиращ режим, ако е възможно. Нито отварянето, нито каквито и да било последващи операции върху върнатия файлов дескриптор причиняват изчакване на извикващия процес. За FIFO канали вижте fifo(4). Този режим няма ефект върху не-FIFO файлове.);
O_SYNC (Файлът се отваря в синхронен I/O режим. Всички извиквания за запис към съответния файлов дескриптор ще блокират процеса на извикване, докато данните не бъдат физически записани. Въпреки това, трябва да прочетете раздела ОГРАНИЧЕНИЯ);
O_DIRECTORY (Ако pathname не е директория, тогава open ще покаже грешка. Този флаг се използва само в Linux и е добавен към ядрото 2.1.126, за да се избегнат проблеми с отказ на услуга, ако opendir(2) е извикан на FIFO канал или лентово устройство. Този флаг не трябва да се използва извън внедряването на opendir);
O_LARGEFILE (На 32-битови системи, които поддържат файлови системи (големи), този флаг позволява да се отварят файлове, по-големи от 31 бита.
Някои от горните флагове могат да бъдат променени с fctnl след отваряне на файла. Аргументът за режим указва разрешенията, които да се използват, когато се създава нов файл. Те се модифицират по обичайния начин, с umask на процеса; разрешения на създадения файл равен (режим &
umask). Имайте предвид, че този режим се прилага само за разрешенията на файла, който се създава; open създава файл само за четене, но може да върне манипулатор с поставени флагове за четене и запис.
Следните символни константи могат да се използват в режим:
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.
ВЪЗВРАТНА СТОЙНОСТотваряне и създаване връща нов файлов дескриптор или -1 при грешка (в който случай errno е зададено правилно ). Имайте предвид, че open може да отваря файлове на устройството, но create не можеможе да ги създаде, така че използвайте функцията mknod(2), за да ги създадете.
В NFS файлови системи, където потребителските идентификатори могат да бъдат разрешени, open може да върне файлов дескриптор, но например read(2) ще върне EACCES грешка поради това, че клиентът издава командата за отваряне проверка на разрешенията (и преобразуването на самоличност се извършва от сървъра при заявки за четене и запис).
Ако файлът е създаден, времето за последен достъп, създаване и модификация се задава на текущото време, а полетата за модификация и време за създаване на родителска директория са зададени. В противен случай, ако файлът е модифициран с флага O_TRUNC, тогава времето за неговото създаване и времето за модификация се задават на текущото време.
КОДОВЕ НА ГРЕШКИEEXIST пътека вече съществува, но O_CREAT и O_EXCL са използвани.
EISDIR Типът достъп предполага запис, а пътеката сочи към директория (т.е. зададена на O_WRONLY или O_RDWR).
EACCES Заявеният достъп до файла не е разрешен или една от директориите в pathname не позволява намиране (изпълнение) на файла, файлът все още не съществува или достъпът за запис в родителската директория не е разрешен.
ENAMETOOLONG името на пътя е твърде дълго.
ENOENT O_CREAT не е зададен и посоченият файл не съществува. Или директорията не съществува в path- name, или това е невалидна символна връзка.
ENOTDIR Компонентът, идентифициран като директория в path- name не е, или флагът O_DIRECTORY е посочен и pathname не е директория.
ENXIO O_NONBLOCK O_WRONLY е зададен, файлът е FIFO канал, но няма процеси, отварящи този канал за четене. Възможно е също файлът е файл на устройство, но съответното устройство не е инсталирано.
ENODEV pathname препраща към файл на устройство, но съответното устройство не съществува. (Това е бъг в ядрото на Linux: ENXIO трябва да се върне).
Беше заявен достъп за запис на EROFS и името на пътя се отнася до файл, разположен на система само за четене.
ETXTBSY pathname препраща към файл, който се изпълнява в момента и е поискан достъп за запис.
ELOOP Твърде много символни връзки има в path- name, или е зададен флагът O_NOFOLLOW и pathname е символна връзка.
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.