Каждый файловый поток ассоциирован с низкоуровневым дескриптором файла. Вы можете смешивать операции низкоуровневого ввода/вывода с высокоуровневыми потоковыми операциями, но это, как правило, неразумно, потому что трудно предсказать эффект от применения буферизации.
#include
int fileno(FILE *stream);
FILE *fdopen(int fildes, const char *mode);
Вы можете определить, какой низкоуровневый дескриптор файла применяется для файлового потока, вызвав функцию fileno
. Она возвращает дескриптор файла для заданного потока или -1 в случае сбоя. Эта функция полезна при необходимости низкоуровневого доступа к открытому потоку, например для вызова функции fstat
применительно к этому потоку.
Можно создать новый поток файла на основе дескриптора файла, открытого только для чтения, применив функцию fdopen
. По существу, эта функция предоставляет буферы stdio для уже открытого файлового дескриптора, это может быть самый легкий вариант объяснения ее назначения.
Функция fdopen
действует так же, как функция fopen
, но в отличие от имени файла она принимает в качестве параметра низкоуровневый дескриптор файла. Это может пригодиться, если вы используете вызов open для создания файла, может быть для более тонкого управления правами доступа, но хотите применить поток для записи в файл. Параметр mode такой же, как у функции fopen
и должен быть совместим с режимами доступа к файлу, установленными при первоначальном открытии файла. Функция fdopen
возвращает новый файловый поток или NULL
в случае неудачного завершения.
Ведение файлов и каталогов
Стандартные библиотеки и системные вызовы обеспечивают полный контроль над созданием и ведением файлов и каталогов.
С помощью системного вызова chmod
вы можете изменять права доступа к файлу или каталогу. Он лежит в основе программы командной оболочки chmod
.
Далее приведена синтаксическая запись вызова:
#include
int chmod(const char *path, mode_t mode);
Права доступа к файлу, заданному параметром path
, изменяются в соответствии со значением параметра mode
. Режим файла mode
задается как в системном вызове open с помощью поразрядной операции OR
, формирующей требуемые права доступа. Если программе не даны соответствующие полномочия, только владелец файла и суперпользователь могут изменять права доступа к файлу.
Суперпользователь может изменить владельца файла с помощью системного вызова chown.
#include #include
int chown(const char *path, uid_t owner, gid_t group);
В вызове применяются числовые значения идентификаторов (ID) нового пользователя и группы (взятые из системных вызовов getuid
и getgid
) и системная величина, используемая для ограничения пользователей, имеющих разрешение изменять владельца файла. Владелец и группа файла изменяются, если заданы соответствующие полномочия.
Примечание
Стандарт POSIX в действительности допускает существование систем, в которых несуперпользователи могут изменять права владения файлом. Все "правильные" с точки зрения POSIX системы не допускают этого, но строго говоря, это расширение стандарта (в FIPS 151-2). Все виды систем, с которыми мы имеем дело в этой книге, подчиняются спецификации XSI (X/Open System Interface) и соблюдают на деле правила владения.
С помощью вызова unlink
вы можете удалить файл.
Системный вызов unlink
удаляет запись о файле в каталоге и уменьшает на единицу счетчик ссылок на файл. Он возвращает 0, если удаление ссылки прошло успешно, и -1 в случае ошибки. Для выполнения вызова у вас должны быть права на запись и выполнение в каталоге, хранящем ссылку на файл.
#include
int unlink(const char *path);
int link(const char *path1, const char *path2);
int symlink(const char *path1, const char *path2);
Если счетчик становится равен нулю и файл не открыт ни в одном процессе, он удаляется. В действительности элемент каталога всегда удаляется немедленно, а место, занятое содержимым файла, не очищается до тех пор, пока последний процесс (если таковой существует) не закроет файл. Этот вызов использует программа rm
. Дополнительные ссылки, предоставляющие альтернативные имена файла, обычно создаются программой ln
. Вы можете программно создать новые ссылки на файл с помощью системного вызова link
.
Читать дальше