В исходных системах Unix были только системные вызовы chown()
chmod(). Однако, на сильно загруженных системах эти системные вызовы попадают в условия состязания, посредством чего злоумышленник может организовать замещение другим файлом файла, у которого изменяется владелец или права доступа.Однако, после открытия файла условие состязания больше не представляет проблему. Программа может использовать stat()
fstat() может проверить, что файл тот же самый (сравнив поля st_dev и st_ino структур struct stat «до» и «после»).Когда программа знает, что файлы те же самые, владение или права доступа могут быть изменены с помощью fchown()
fchmod().Эти системные вызовы, также как 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 содержит номер индекса и имя файла. Максимально переносимый код использует в члене d_name только имя файла. Функции BSD telldir() и seekdir() для сохранения и восстановления текущего положения в каталоге широко доступны, но не полностью переносимы, как другие функции работы с каталогами.• Вспомогательные данные получаются с помощью семейства системных вызовов stat()
struct stat содержит всю информацию о файле • Макрос S_IS
дает возможность определить тип файла. Функции major() и minor() из дают возможность расшифровки значений dev_t, представляющих блочные и символьные устройства.• Символические ссылки можно проверить, использовав lstat()
st_size структуры struct stat для символической ссылки возвращает число байтов, необходимых для размещения имени указываемого файла. Содержимое символической ссылки читают с помощью readlink(). Нужно позаботиться о том, чтобы размер буфера был правильным и чтобы завершить полученное имя файла нулевым байтом, чтобы можно было его использовать в качестве строки С.• Несколько разнообразных системных вызовов обновляют другие данные: семейство chown()
chmod() для прав доступа к файлу, a utime() для изменения значений времени доступа и изменения файла.Упражнения
1. Напишите программу 'const char *fmt_mode(mode_t mode)
mode_t, полученное из поля st_mode структуры struct stat; т.е. оно содержит как биты прав доступа, так и типа файла.Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT