При работе с системными вызовами на основе дескрипторов файлов и стандартных ввода, вывода и ошибки целые константы 0, 1 и 2 обычно используются прямо в коде. В подавляющем большинстве случаев использование таких
:STDIN_FILENO
STDOUT_FILENO
STDERR_FILENO
Однако, по нашему скромному мнению, использование этих макросов избыточно. Во-первых,
С другой стороны, использование этих констант не оставляет сомнений в намерениях программиста. Сравните это утверждение:
int fd = 0;
Инициализируется ли fd
Один из подходов (рекомендованный Джеффом Колье (Geoff Collyer)) заключается в использовании следующего определения enum
enum { Stdin, Stdout, Stderr };
Затем эти константы можно использовать вместо 0, 1 и 2. Их легко читать и печатать.
4.4.2. Открытие и закрытие файлов
Новые дескрипторы файлов получают (наряду с другими источниками) в результате системного вызова open()
#include
#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_RDONLY | 0 | Открыть файл только для чтения, запись невозможны |
O_WRONLY | 1 | Открыть файл только для записи, чтение невозможно |
O_RDWR | 2 | Открыть файл для чтения и записи |