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. |