Linux программирование в примерах | страница 78



набирать 12 или 13 символов вместо 1. Во-вторых, использование 0, 1 и 2 так стандартно и так хорошо известно, что на самом деле нет никаких оснований для путаницы в смысле этих конкретных символических констант.

С другой стороны, использование этих констант не оставляет сомнений в намерениях программиста. Сравните это утверждение:

>int fd = 0;

Инициализируется ли >fd значением стандартного ввода, или же программист благоразумно инициализирует свои переменные подходящим значением? Вы не можете этого сказать.

Один из подходов (рекомендованный Джеффом Колье (Geoff Collyer)) заключается в использовании следующего определения >enum:

>enum { Stdin, Stdout, Stderr };

Затем эти константы можно использовать вместо 0, 1 и 2. Их легко читать и печатать.

4.4.2. Открытие и закрытие файлов

Новые дескрипторы файлов получают (наряду с другими источниками) в результате системного вызова >open(). Этот системный вызов открывает файл для чтения или записи и возвращает новый дескриптор файла для последующих операций с этим файлом. Мы видели объявление раньше:

>#include /* POSIX */

>#include

>#include

>#include


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

Три аргумента следующие:

>const char *pathname

Строка С, представляющая имя открываемого файла.

>int flags

Поразрядное ИЛИ с одной или более констант, определенных в >. Вскоре мы их рассмотрим.

>mode_t mode

Режимы доступа для создаваемого файла. Это обсуждается далее в главе, см. раздел 4.6 «Создание файлов». При открытии существующего файла опустите этот параметр[46].

Возвращаемое open() значение является либо новым дескриптором файла, либо -1, означающим ошибку, в этом случае будет установлена >errno. Для простого ввода/вывода аргумент >flags должен быть одним из значений из табл. 4.3.


Таблица 4.3. Значения >flags для >open()

Именованная константаЗначениеКомментарий
>O_RDONLY0Открыть файл только для чтения, запись невозможны
>O_WRONLY1Открыть файл только для записи, чтение невозможно
>O_RDWR2Открыть файл для чтения и записи

Вскоре мы увидим пример кода. Дополнительные значения >flags описаны в разделе 4.6 «Создание файлов». Большой объем ранее написанного кода Unix не использовал эти символические значения. Вместо этого использовались числовые значения. Сегодня это рассматривается как плохая практика, но мы представляем эти значения, чтобы вы их распознали, если встретитесь с ними

Системный вызов >close() закрывает файл: его элемент в системной таблице дескрипторов файлов помечается как неиспользуемый, и с этим дескриптором нельзя производить никаких дальнейших действий. Объявление следующее: