Можно создать новый поток файла на основе дескриптора файла, открытого только для чтения, применив функцию
fdopen
. По существу, эта функция предоставляет буферы stdio для уже открытого файлового дескриптора, это может быть самый легкий вариант объяснения ее назначения.
Функция
fdopen
действует так же, как функция
fopen
, но в отличие от имени файла она принимает в качестве параметра низкоуровневый дескриптор файла. Это может пригодиться, если вы используете вызов open для создания файла, может быть для более тонкого управления правами доступа, но хотите применить поток для записи в файл. Параметр mode такой же, как у функции
fopen
и должен быть совместим с режимами доступа к файлу, установленными при первоначальном открытии файла. Функция
fdopen
возвращает новый файловый поток или
NULL
в случае неудачного завершения.
Ведение файлов и каталогов
Стандартные библиотеки и системные вызовы обеспечивают полный контроль над созданием и ведением файлов и каталогов.
chmod
С помощью системного вызова
chmod
вы можете изменять права доступа к файлу или каталогу. Он лежит в основе программы командной оболочки
chmod
.
Далее приведена синтаксическая запись вызова:
<b>#include <sys/stat.h></b>
<b>int chmod(const char *path, mode_t mode);</b>
Права доступа к файлу, заданному параметром
path
, изменяются в соответствии со значением параметра
mode
. Режим файла
mode
задается как в системном вызове open с помощью поразрядной операции
OR
, формирующей требуемые права доступа. Если программе не даны соответствующие полномочия, только владелец файла и суперпользователь могут изменять права доступа к файлу.
chown
Суперпользователь может изменить владельца файла с помощью системного вызова chown.
<b>#include <sys/types.h> #include <unistd.h></b>
<b>int chown(const char *path, uid_t owner, gid_t group);</b>
В вызове применяются числовые значения идентификаторов (ID) нового пользователя и группы (взятые из системных вызовов
getuid
и
getgid
) и системная величина, используемая для ограничения пользователей, имеющих разрешение изменять владельца файла. Владелец и группа файла изменяются, если заданы соответствующие полномочия.
Примечание
Стандарт POSIX в действительности допускает существование систем, в которых несуперпользователи могут изменять права владения файлом. Все "правильные" с точки зрения POSIX системы не допускают этого, но строго говоря, это расширение стандарта (в FIPS 151-2). Все виды систем, с которыми мы имеем дело в этой книге, подчиняются спецификации XSI (X/Open System Interface) и соблюдают на деле правила владения.
unlink, link и symlink
С помощью вызова
unlink
вы можете удалить файл.
Системный вызов
unlink
удаляет запись о файле в каталоге и уменьшает на единицу счетчик ссылок на файл. Он возвращает 0, если удаление ссылки прошло успешно, и -1 в случае ошибки. Для выполнения вызова у вас должны быть права на запись и выполнение в каталоге, хранящем ссылку на файл.
<b>#include <unistd.h></b>
<b>int unlink(const char *path);</b>
<b>int link(const char *path1, const char *path2);</b>
<b>int symlink(const char *path1, const char *path2);</b>
Если счетчик становится равен нулю и файл не открыт ни в одном процессе, он удаляется. В действительности элемент каталога всегда удаляется немедленно, а место, занятое содержимым файла, не очищается до тех пор, пока последний процесс (если таковой существует) не закроет файл. Этот вызов использует программа
rm
. Дополнительные ссылки, предоставляющие альтернативные имена файла, обычно создаются программой
ln
. Вы можете программно создать новые ссылки на файл с помощью системного вызова
link
.
Примечание
Создание файла с помощью вызова
open
и последующее обращение к
unlink
для этого файла — трюк, применяемый некоторыми программистами для создания временных или транзитных файлов. Эти файлы доступны программе, только пока они открыты; и будут удалены автоматически, когда программа завершится, и файлы будут закрыты.
Системный вызов
link
создает новую ссылку на существующий файл
path1
. Новый элемент каталога задается в
path2
. Символические ссылки можно создавать аналогичным образом с помощью системного вызова
symlink
. Имейте в виду, что символические ссылки на файл не увеличивают значение счетчика ссылок и таким образом, в отличие от обычных (жестких) ссылок, не мешают удалению файла.
mkdir и rmdir
Вы можете создавать и удалять каталоги, применяя системные вызовы
mkdir
и
rmdir
.
<b>#include <sys/types.h>#include <sys/stat.h></b>
<b>int mkdir(const char *path, mode_t mode);</b>
Системный вызов
mkdir
используется для создания каталогов и эквивалентен программе
mkdir
. Вызов
mkdir
формирует новый каталог с именем, указанным в параметре
path
. Права доступа к каталогу передаются в параметре mode и задаются как опция о
O_CREAT
в системном вызове open и также зависят от переменной
umask
.
<b>#include <unistd.h></b>
<b>int rmdir(const char *path);</b>
Системный вызов
rmdir
удаляет каталоги, но только если они пустые. Программа
rmdir
использует этот системный вызов для выполнения аналогичной работы.
chdir и getcwd
Программа может перемещаться по каталогам во многом так же, как пользователь перемещается по файловой системе. Как вы применяете в командной оболочке команду
cd
для смены каталога, так и программа может использовать системный вызов
chdir
.