Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

#include <sys/types.h> /* POSIX */

#include <sys/stat.h>

#include <fcntl.h>

int creat(const char *pathname, mode_t mode);

Аргумент

mode
представляет права доступа к новому файлу (как обсуждалось в предыдущем разделе). Создается файл с именем
pathname.с
данными правами доступа, модифицированными с использованием
umask
. Он открыт (только) для чтения, а возвращаемое значение является дескриптором нового файла или -1, если была проблема. В последнем случае
errno
указывает ошибку. Если файл уже существует, он будет при открытии урезан.

Во всех остальных отношениях дескрипторы файлов, возвращаемые

creat
, являются теми же самыми, которые возвращаются
open
; они используются для записи и позиционирования и должны закрываться при помощи
close
:

int fd, count;

/* Проверка ошибок для краткости опущена */

fd = creat("/some/new/file", 0666);

count = write(fd, "some data\n", 10);

(void)close(fd);

4.6.3. Возвращаясь к open

Вы можете вспомнить объявление для

open
:

int open(const char *pathname, int flags, mode_t mode);

Ранее мы сказали, что при открытии файла для простого ввода/вывода мы можем игнорировать аргумент

mode
. Хотя, посмотрев на
creat
, вы, возможно, догадались, что
open
также может использоваться для создания файлов и что в этом случае используется аргумент
mode
. Это в самом деле так.

Помимо флагов

O_RDONLY
,
O_WRONLY
и
O_RDWR
, при вызове
open
могут добавляться с использованием поразрядного
OR
дополнительные флаги. Стандарт POSIX предоставляет ряд этих дополнительных флагов. В табл. 4.7 представлены флаги, которые используются для большинства обычных приложений.

Таблица 4.7. Дополнительные флаги POSIX для

open

Флаг Значение
O_APPEND
Принудительно осуществляет все записи в конец файла
O_CREAT
Создает новый файл, если он не существует.
O_EXCL
При использовании вместе с
O_CREAT
возвращает ошибку, если файл уже существует
O_TRUNC
Урезает файл (устанавливает его длину в 0), если он существует.

Если даны

O_APPEND
и
O_TRUNC
, можно представить, как оболочка могла бы открывать или создавать файлы, соответствующие операторам
>
и
>>
. Например:

int fd;

extern char *filename;

mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; /* 0666 */

fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, mode); /* для > */

fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, mode); /* для >> */

Обратите внимание, что флаг

O_EXCL
здесь не используется, поскольку как для
>
, так и для
>>
не является ошибкой существование файла. Запомните также, что система применяет к запрошенным правам доступа
umask
.

Также легко видеть, что, по крайней мере концептуально,

creat
можно было бы легко написать следующим образом:

int creat(const char *path, mode_t mode) {

 return open(path, O_CREAT | O_WRONLY | O_TRUNC, mode);

}

ЗАМЕЧАНИЕ. Если файл открыт с флагом

O_APPEND
, все данные будут записаны в конец файла, даже если текущее смещение было восстановлено с помощью
lseek
.

Современные системы предоставляют дополнительные флаги с более специализированным назначением. Они кратко описаны в табл. 4.8.

Таблица 4.8. Дополнительные расширенные флаги POSIX для

open

Флаг Значение
O_APPEND
Принудительно осуществляет все записи в конец файла
O_CREAT
Создает новый файл, если он не существует.
O_EXCL
При использовании вместе с
O_CREAT
возвращает ошибку, если файл уже существует
O_TRUNC
Урезает файл (устанавливает его длину в 0), если он существует.

Флаги

O_DSYNC
,
O_RSYNC
и
O_SYNC
требуют некоторых пояснений. Системы Unix (включая Linux) содержат внутренний кэш дисковых блоков, который называется буферным кэшем (buffer cache). Когда возвращается системный вызов
write
, данные, переданные операционной системе, были скопированы в буфер в буферном кэше. Они необязательно были записаны на диск.

Буферный кэш значительно повышает производительность: поскольку дисковый ввод/ вывод часто на порядок и медленнее операций центрального процессора и памяти, программы значительно снизили бы производительность, если бы им пришлось ждать завершения каждой записи на диск. Вдобавок, если данные были недавно записаны на диск, при последующем чтении тех же данных они уже находились бы в буферном кэше, откуда их можно вернуть немедленно, не дожидаясь завершения операции чтения с диска.

Системы Unix осуществляют также опережающее чтение; поскольку чтение в большинстве случаев последовательное, операционная система после прочтения одного блока осуществляет чтение нескольких дополнительных последовательных блоков таким образом, что эта информация будет уже находиться в кэше, когда программа ее запросит. Если один и тот же файл читают несколько программ, они все получают преимущество, поскольку все получают свои данные из одной копии дисковых блоков файла в буферном кэше.

Все это кэширование, конечно, замечательно, но бесплатного обеда не бывает. В то время, пока данные находятся в буферном кэше и до того, как они будут записаны на диск, есть небольшое, но вполне реальное окно, в котором может случиться катастрофа; например, если выключат питание. Современные дисковые приводы обостряют эту проблему: у многих из них есть собственные внутренние буферы, поэтому при записи данных на диск они могут оказаться не записанными на носитель при выключении питания! Это может быть значительной проблемой для небольших систем, которые не находятся в информационном центре с контролируемым энергоснабжением или не имеют источников бесперебойного питания (UPS). [50]

50

Если у вас нет UPS и вы используете систему для критической работы, мы настоятельно рекомендуем вам обзавестись им. Следует также регулярно делать резервные копии. — Примеч. автора.

Поделиться:
Популярные книги

Товарищ "Чума" 5

lanpirot
5. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 5

Двойник короля 15

Скабер Артемий
15. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 15

Страж Кодекса. Книга IV

Романов Илья Николаевич
4. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга IV

Древесный маг Орловского княжества 6

Павлов Игорь Васильевич
6. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 6

Антимаг

Гедеон Александр и Евгения
1. Антимаг
Фантастика:
фэнтези
6.95
рейтинг книги
Антимаг

Мы - истребители

Поселягин Владимир Геннадьевич
2. Я - истребитель
Фантастика:
альтернативная история
8.55
рейтинг книги
Мы - истребители

На границе империй. Том 3

INDIGO
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
На границе империй. Том 3

По осколкам твоего сердца

Джейн Анна
2. Хулиган и новенькая
Любовные романы:
современные любовные романы
5.56
рейтинг книги
По осколкам твоего сердца

Первый среди равных. Книга V

Бор Жорж
5. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга V

Неучтенный элемент. Том 2

NikL
2. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 2

Кодекс Крови. Книга V

Борзых М.
5. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга V

Князь Целитель 8

Ткачев Андрей Юрьевич
8. Князь Целитель
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Князь Целитель 8

Учитель из прошлого тысячелетия

Еслер Андрей
6. Соприкосновение миров
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Учитель из прошлого тысячелетия

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля