Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #51, ФЕВРАЛЬ 2005 г.

C в *nix – залог здоровья

Косякин Антон

Спецвыпуск: Хакер, номер #051, стр. 051-078-4


Напоминаю, что после завершения работы файл нужно обязательно закрыть - системный вызов Close. Напоминаю и про существование man'ов по этим системным вызовам, в которых можно найти намного более подробную информацию по ним.

Не стоит забывать про функцию Fcntl, используемую для управления уже открытыми файлами. Она определена как int fcntl(int fd, int cmd, <что-то зависящее от cmd>). Больше других интересны значения параметра cmd F_GETFL & F_SETFL. Они позволяют узнать\изменить текущие флаги статуса открытого файла. Вот как, например, можно узнать текущий статус файла (модификатор доступа):

int arg = fcntl(fd, F_GETFL);

if (arg & O_APPEND)

printf("флаг O_APPEND");

if ((arg & O_ACCMODE) == O_RDWR)

printf("файл открыт для чтения и записи")

Понятно, что текущий статус файла - некое число, отдельные биты которого сигнализируют об установке (или отсутствии) некоторых флагов. Как показано в примере, поле, в котором хранится значение модификатора доступа, можно вырезать с помощью специальной маски O_ACCMODE, определенной в fcntl.h.

При запуске новой программы ОС автоматически открывает три дескриптора файла, которые называются стандартным вводом, стандартным выводом и стандартным выводом диагностики соответственно. Они всегда имеют значения 0, 1 и 2. Не спутай stdin, stdout & stderr с чем-нибудь другим из стандартной билиотеки ввода\вывода.

По умолчанию использование системного вызова Read на стандартном вводе приведет к чтению с клавиатуры, запись в стандартный вывод или вывод диагностики приведут к выводу информации на экран терминала. Как ты понимаешь, такого может и не быть :).

Системные вызовы ввода\вывода являются основой всей системы ввода\вывода *nix, но они примитивны и предоставляют возможность работы с данными в виде простой последовательности байт, что не всегда может быть удобно для программиста, потому что заставляет его задумываться над многими вещами. Хочу напомнить тебе о стандартной библиотеке ввода\вывода, описанной в stdio.h и содержащей намного больше средств (fprintf, getc, putc, etc), нежели упомянутые системные вызовы.

В *nix с каждым процессом связана маска создания файла, которая используется для автоматического выключения заданных битов прав доступа при создании новых файлов. Это бывает полезно для защиты от случайного включения "ненужных" прав доступа. В терминах языка C, если считать, что маска задана в целочисленной переменной Mask, то реальные права доступа будут получены следующим выражением: (~mask) & mode.

Назад на стр. 051-078-3  Содержание  Вперед на стр. 051-078-5