Основы программирования в Linux
Можно создать новый поток файла на основе дескриптора файла, открытого только для чтения, применив функцию
. По существу, эта функция предоставляет буферы stdio для уже открытого файлового дескриптора, это может быть самый легкий вариант объяснения ее назначения.fdopenФункция
действует так же, как функцияfdopen, но в отличие от имени файла она принимает в качестве параметра низкоуровневый дескриптор файла. Это может пригодиться, если вы используете вызов open для создания файла, может быть для более тонкого управления правами доступа, но хотите применить поток для записи в файл. Параметр mode такой же, как у функцииfopenи должен быть совместим с режимами доступа к файлу, установленными при первоначальном открытии файла. Функцияfopenвозвращает новый файловый поток илиfdopenв случае неудачного завершения.NULLВедение файлов и каталогов
Стандартные библиотеки и системные вызовы обеспечивают полный контроль над созданием и ведением файлов и каталогов.
chmod
С помощью системного вызова
вы можете изменять права доступа к файлу или каталогу. Он лежит в основе программы командной оболочкиchmod.chmodДалее приведена синтаксическая запись вызова:
<b>#include <sys/stat.h></b><b>int chmod(const char *path, mode_t mode);</b>Права доступа к файлу, заданному параметром
, изменяются в соответствии со значением параметраpath. Режим файлаmodeзадается как в системном вызове open с помощью поразрядной операцииmode, формирующей требуемые права доступа. Если программе не даны соответствующие полномочия, только владелец файла и суперпользователь могут изменять права доступа к файлу.ORchown
Суперпользователь может изменить владельца файла с помощью системного вызова 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Системный вызов
удаляет запись о файле в каталоге и уменьшает на единицу счетчик ссылок на файл. Он возвращает 0, если удаление ссылки прошло успешно, и -1 в случае ошибки. Для выполнения вызова у вас должны быть права на запись и выполнение в каталоге, хранящем ссылку на файл.unlink<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. Имейте в виду, что символические ссылки на файл не увеличивают значение счетчика ссылок и таким образом, в отличие от обычных (жестких) ссылок, не мешают удалению файла.symlinkmkdir и 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. Права доступа к каталогу передаются в параметре mode и задаются как опция оpathв системном вызове open и также зависят от переменнойO_CREAT.umask<b>#include <unistd.h></b><b>int rmdir(const char *path);</b>Системный вызов
удаляет каталоги, но только если они пустые. Программаrmdirиспользует этот системный вызов для выполнения аналогичной работы.rmdirchdir и getcwd
Программа может перемещаться по каталогам во многом так же, как пользователь перемещается по файловой системе. Как вы применяете в командной оболочке команду
для смены каталога, так и программа может использовать системный вызовcd.chdir