Читаем Linux API. Исчерпывающее руководство полностью

Начиная с версии ядра 2.6.22, для получения информации о дескрипторах файлов любого имеющегося в системе процесса могут быть прочитаны файлы в каталоге /proc/PID/fdinfo, которые есть только в Linux. В этом каталоге находится по одному файлу для каждого дескриптора открытого процессом файла, с именем, совпадающим с номером дескриптора. В поле pos этого файла показано текущее смещение в файле (см. раздел 4.7). В поле flags находится восьмеричное число, показывающее флаги режима доступа к файлу и флаги состояния открытого файла. (Чтобы декодировать эти числа, нужно посмотреть на числовые значения флагов в заголовочных файлах библиотеки языка C.)

Рассмотрим константы флагов подробнее.

• O_APPEND — записи добавляются исключительно в конец файла. Значение этого флага рассматривается в разделе 5.1.

• O_ASYNC — генерирование сигнала при появлении возможности ввода-вывода с использованием файлового дескриптора, возвращенного системным вызовом open(). Это свойство называется вводом-выводом под управлением сигналов. Оно доступно только для файлов определенного типа, таких как терминалы, FIFO-устройства и сокеты. (Флаг O_ASYNC не определен в SUSv3, но в большинстве реализаций UNIX он или его синоним FASYNC присутствует.) В Linux указание флага O_ASYNC при вызове open() не имеет никакого эффекта. Чтобы включить ввод/вывод с сигнальным управлением, нужно установить этот флаг, указывая в fcntl() операцию F_SETFL (см. раздел 5.3). (Некоторые другие реализации UNIX ведут себя аналогичным образом.) Дополнительные сведения о флаге O_ASYNC можно найти в разделе 59.3.

• O_CLOEXEC (с выходом Linux 2.6.23) — установка флага закрытия при выполнении — флага close-on-exec (FD_CLOEXEC) для нового дескриптора файла. Флаг FD_CLOEXEC рассматривается в разделе 27.4. Использование флага O_CLOEXEC позволяет программе не выполнять дополнительные операции F_GETFD и F_SETFD при вызове fcntl() для установки флага close-on-exec. Кроме того, в многопоточных программах необходимо избегать состояния гонки, возможное при использовании данной технологии. Например, такое состояние может возникать, когда один поток открывает дескриптор файла, а затем пытается пометить его флагом close-on-exec, и в то же самое время другой поток выполняет системный вызов fork(), а затем exec() из какой-нибудь другой программы. (Предположим, что второй поток справляется и с fork(), и с exec() в период между тем, как первый поток открывает файловый дескриптор и использует fcntl() для установки флага close-on-exec.) Такое состязание может привести к тому, что открытые дескрипторы файлов могут непреднамеренно быть переданы небезопасным программам. (Состояние гонки подробнее рассматривается в разделе 5.1.)

• O_CREAT — создание нового, пустого файла, если такого файла еще не существует. Этот флаг срабатывает, даже если файл открывается только для чтения. Если указывается O_CREAT, то при вызове open() нужно также обязательно предоставлять аргумент mode. В противном случае права доступа к новому файлу будут установлены по какому-либо произвольному значению, взятому из стека.

• O_DIRECT — разрешение файловому вводу-выводу обходить буферный кэш. Это свойство рассматривается в разделе 13.6. Чтобы сделать определение этой константы доступным из , должен быть задан макрос проверки возможностей _GNU_SOURCE.

• O_DIRECTORY — возвращение ошибки (в этом случае errno присваивается значение ENOTDIR), если путевое имя не является каталогом. Этот флаг представляет собой расширение, разработанное главным образом для реализации opendir() (см. раздел 18.8). Чтобы сделать определение этой константы доступным из , должен быть задан макрос проверки возможностей _GNU_SOURCE.

• O_DSYNC (с выходом Linux 2.6.33) — выполнение записи в файл в соответствии с требованиями соблюдения целостности данных при синхронизированном вводе-выводе. Обратите внимание на буферизацию ввода-вывода на уровне ядра, рассматриваемую в разделе 13.3.

• O_EXCL — используется в сочетании с флагом O_CREAT как указание, что файл, если он уже существует, не должен быть открыт. Вместо этого системный вызов open() не выполняется, а errno присваивается значение EEXIST. Иными словами, флаг позволяет вызывающему коду убедиться в том, что это и есть процесс, создающий файл. Проверка существования и создание файла выполняются в атомарном режиме. Понятие атомарности рассматривается в разделе 5.1. Когда в качестве флагов указаны и O_CREAT, и O_EXCL, системный вызов open() не выполняется (с ошибкой EEXIST), если путевое имя является символьной ссылкой. Такое поведение в SUSv3 требуется, чтобы привилегированные приложения могли создавать файл в определенном месте и при этом исключалась возможность создания файла в другом месте с использованием символьной ссылки (например, в системном каталоге), которая негативно скажется на безопасности.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных