Linux программирование в примерах
Функция
(строки 75–82) является «заместителемrpl_utime()». Если второй аргумент не равенutime(), она вызывает настоящуюNULL. В противном случае она вызываетutime().utime_null()5.5.4. Использование
иfchown()для обеспечения безопасностиfchmod()В исходных системах Unix были только системные вызовы
иchown(). Однако, на сильно загруженных системах эти системные вызовы попадают в условия состязания, посредством чего злоумышленник может организовать замещение другим файлом файла, у которого изменяется владелец или права доступа.chmod()Однако, после открытия файла условие состязания больше не представляет проблему. Программа может использовать
с именем файла для получения информации о файле. Если получены сведения, которые ожидались, после открытия файлаstat()может проверить, что файл тот же самый (сравнив поляfstat()иst_devструктурst_ino«до» и «после»).struct statКогда программа знает, что файлы те же самые, владение или права доступа могут быть изменены с помощью
илиfchown().fchmod()Эти системные вызовы, также как
, сравнительно недавние; [63] в старых системах Unix их не было, хотя в современных совместимых с POSIX системах они есть.lchown()Соответствующих функций
илиfutime()нет. В случаеlutime()это (очевидно) потому, что временные отметки не являются критическими для безопасности системы в том же отношении, что для владения и прав доступа,futime()отсутствует потому, что временные отметки неуместны для символических ссылок.lutime()5.6. Резюме
• Иерархия файлов и каталогов, как она видится пользователю, является одним логическим деревом, корень которого находится в
. Оно составлено из одного или более разделов, каждый из которых содержит файловую систему. Внутри файловой системы в индексах хранятся данные о файлах (метаданные), включая размещение блоков данных./• Каталоги осуществляют связь между именами файлов и индексами. Концептуально содержимое каталога, которое является просто последовательностью пар (индекс, имя). Каждый элемент каталога для файла называется (прямой) ссылкой, а файлы могут иметь множество ссылок. Прямые ссылки, поскольку они работают лишь по номеру индекса, все должны находиться в одной файловой системе. Символические ссылки являются указателями на файлы или каталоги и работают на основе имени файла, а не номера индекса, поэтому их использование не ограничено одной и той же файловой системой.
• Прямые ссылки создаются с помощью
, символические ссылки создаются с помощьюlink(), ссылки удаляются с помощьюsymlink(), а переименовываются файлы (с возможным перемещением в другой каталог) с помощьюunlink(). Блоки данных файла не освобождаются до тех пор, пока счетчик ссылок не достигнет нуля и не закроется последний открытый дескриптор файла.rename()• Каталоги создаются с помощью
, а удаляются с помощьюmkdir(); перед удалением каталог должен быть пустым (не оставлено ничего, кроме 'rmdir()' и '.'). GNU/Linux версия функции ISO С..вызывает соответствующие функцииremove()илиunlink().rmdir()• Каталоги обрабатываются с помощью функций
,opendir(),readdir()иrewinddir().closedir()содержит номер индекса и имя файла. Максимально переносимый код использует в членеstruct direntтолько имя файла. Функции BSDd_nameиtelldir()для сохранения и восстановления текущего положения в каталоге широко доступны, но не полностью переносимы, как другие функции работы с каталогами.seekdir()• Вспомогательные данные получаются с помощью семейства системных вызовов
, структураstat()содержит всю информацию о файле за исключением имени файла. (В самом деле, поскольку у файла может быть множество имен или он может совсем не иметь ссылок, невозможно сделать имя доступным.)struct stat• Макрос
вS_IS<i>xxx</i>()дает возможность определить тип файла. Функции<sys/stat.h>иmajor()изminor()дают возможность расшифровки значений<sys/sysmacros.h>, представляющих блочные и символьные устройства.dev_t• Символические ссылки можно проверить, использовав
, а полеlstat()структурыst_sizeдля символической ссылки возвращает число байтов, необходимых для размещения имени указываемого файла. Содержимое символической ссылки читают с помощьюstruct stat. Нужно позаботиться о том, чтобы размер буфера был правильным и чтобы завершить полученное имя файла нулевым байтом, чтобы можно было его использовать в качестве строки С.readlink()• Несколько разнообразных системных вызовов обновляют другие данные: семейство
используется для смены владельца и группы, процедурыchown()для прав доступа к файлу, achmod()для изменения значений времени доступа и изменения файла.utime()Упражнения
1. Напишите программу '
'. Ввод представляет собой значениеconst char *fmt_mode(mode_t mode), полученное из поляmode_tструктурыst_mode; т.е. оно содержит как биты прав доступа, так и типа файла.struct statВывод должен представлять строку в 10 символов, идентичную первому полю вывода '
'. Другими словами, первый символ обозначает тип файла, а остальные девять — права доступа.ls -lКогда установлены биты
иS_ISUID, используйтеS_IXUSRвместоs; если установлен лишь битx, используйтеI_ISUID. То же относится к битамSиS_ISGID. Если установлены оба битаS_IXGRPиS_ISVTX, используйтеS_IXOTH; для одногоtиспользуйтеS_ISVTX.T