Linux программирование в примерах
Шрифт:
Здесь сообщение об ошибке включает не только имя программы, но также и имя функции, имя исходного файла и номер строки. Полный список идентификаторов, полезных для диагностики, приведен в табл. 4.2.
Таблица 4.2. Диагностические идентификаторы C99
Идентификатор | Версия С | Значение |
---|---|---|
__DATE__ | C89 | Дата
Mmm nn yyyy » |
__FILE_ | Оригинальная | Имя исходного файла в виде « program.c » |
__LINE__ | Оригинальная | Номер строки исходного файла в виде 42 |
__TIME__ | C89 | Время компиляции в виде « hh:mm:ss » |
__func__ | C99 | Имя текущей функции, как если бы было объявлено const char __func__[] = "name" |
Использование
Сегодня, хотя системы GNU/Linux поставляются с исходными кодами, указанный исходный код часто не устанавливается по умолчанию. Поэтому использование этих идентификаторов для сообщений об ошибках не представляет дополнительной ценности. GNU Coding Standards даже не упоминает их.
4.4. Ввод и вывод
Все операции Linux по вводу/выводу осуществляются посредством дескрипторов файлов. Данный раздел знакомит с дескрипторами файлов, описывает, как их получать и освобождать, и объясняет, как выполнять с их помощью ввод/вывод.
4.4.1. Понятие о дескрипторах файлов
Дескриптор файла является целым значением. Действительные дескрипторы файлов начинаются с 0 и растут до некоторого установленного системой предела. Эти целые фактически являются индексами таблицы открытых файлов для каждого процесса (Таблица поддерживается внутри операционной системы; она недоступна запущенным программам.) В большинстве современных систем размеры таблиц большие. Команда '
Из С максимальное число открытых файлов возвращается функцией
Следующая небольшая программа выводит результат работы этой функции:
Неудивительно, что после компиляции и запуска эта программа выводит то же значение, что и
Дескрипторы файлов содержатся в обычных переменных
В обычном случае каждая программа начинает свою работу с тремя уже открытыми для нее дескрипторами файлов. Это стандартный ввод, стандартный вывод и стандартная ошибка, с дескрипторами файлов 0, 1 и 2 соответственно. (Если не было использовано перенаправление, каждый из них связан с клавиатурой
При работе с системными вызовами на основе дескрипторов файлов и стандартных ввода, вывода и ошибки целые константы 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 | Открыть файл для чтения и записи |