Linux программирование в примерах
Шрифт:
Неудивительно, что после компиляции и запуска эта программа выводит то же значение, что и
Дескрипторы файлов содержатся в обычных переменных
В обычном случае каждая программа начинает свою работу с тремя уже открытыми для нее
При работе с системными вызовами на основе дескрипторов файлов и стандартных ввода, вывода и ошибки целые константы 0, 1 и 2 обычно используются прямо в коде. В подавляющем большинстве случаев использование таких символических констант (manifest constants) является плохой мыслью. Вы никогда не знаете, каково значение некоторой случайной целой константы и имеет ли к ней какое-нибудь отношение константа с тем же значением, использованная в другой части кода. С этой целью стандарт POSIX требует объявить следующие именованные константы (symbolic constants) в
Однако, по нашему скромному мнению, использование этих макросов избыточно. Во-первых, неприятно набирать 12 или 13 символов вместо 1. Во-вторых, использование 0, 1 и 2 так стандартно и так хорошо известно, что на самом деле нет никаких оснований для путаницы в смысле этих конкретных символических констант.
С другой стороны, использование этих констант не оставляет сомнений в намерениях программиста. Сравните это утверждение:
Инициализируется ли
Один из подходов (рекомендованный Джеффом Колье (Geoff Collyer)) заключается в использовании следующего определения
Затем эти константы можно использовать вместо 0, 1 и 2. Их легко читать и печатать.
4.4.2. Открытие и закрытие файлов
Новые дескрипторы файлов получают (наряду с другими источниками) в результате системного вызова
Три аргумента следующие:
Строка С, представляющая имя открываемого файла.
Поразрядное ИЛИ с одной или более констант, определенных в
Режимы доступа для создаваемого файла. Это обсуждается далее в главе, см. раздел 4.6 «Создание файлов». При открытии существующего файла опустите этот параметр [46] .
46
Возвращаемое open значение является либо новым дескриптором файла, либо -1, означающим ошибку, в этом случае будет установлена
Таблица 4.3. Значения
Именованная константа | Значение | Комментарий |
---|---|---|
O_RDONLY | 0 | Открыть файл только для чтения, запись невозможны |
O_WRONLY | 1 | Открыть файл только для записи, чтение невозможно |
O_RDWR | 2 | Открыть файл для чтения и записи |
Вскоре мы увидим пример кода. Дополнительные значения
Системный вызов
В случае успеха возвращается 0, при ошибке (-1). При возникновении ошибки нельзя ничего сделать, кроме сообщения о ней. Ошибки при закрытии файлов являются необычными, но не невозможными, особенно для файлов, доступ к которым осуществляется через сеть. Поэтому хорошей практикой является проверка возвращаемого значения, особенно для файлов, открытых для записи.
Если вы будете игнорировать возвращаемое значение, специально приведите его к типу
Легкомысленность этого совета в том, что слишком большое количество приведений к
Как упоминалось, число открытых файлов, если оно большое, ограничивается, и вам всегда следует закрывать файлы, когда работа с ними закончена. Если вы этого не сделаете, то в конечном счете выйдете за пределы лимита дескрипторов файлов, создав ситуацию, которая ведет к потере устойчивости части вашей программы.
Система закрывает все открытые файлы, когда процесс завершается, но — за исключением 0, 1 и 2 — плохая манера полагаться на это.
Когда
4.4.2.1. Отображение переменных
Стандартные библиотечные функции ввода/вывода и переменные
Иногда полезно получить непосредственный доступ к дескриптору файла, связанному с указателем файла
Пример мы увидим позже, в разделе 4.4.4. «Пример: Unix cat».
4.4.2.2. Закрытие всех открытых файлов
Открытые файлы наследуются порожденными процессами от своих родительских процессов. Фактически они являются общими. В частности, общим является положение в файле. Подробности мы оставим для дальнейшего обсуждения в разделе 9.1.1.2 «Разделение дескрипторов файлов».