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