Читаем Linux API. Исчерпывающее руководство полностью

В стандарте SUSv2 для значения, возвращаемого системным вызовом readlink(), указан тип int, и многие современные реализации (а также версии Linux на основе библиотеки glibc) следуют этой спецификации. В стандарте SUSv3 тип возвращаемого значения изменен на ssize_t.


18.6. Создание и удаление каталогов: системные вызовы mkdir() и rmdir()


Системный вызов mkdir() создает новый каталог.

Аргумент pathname задает имя пути для нового каталога. Оно может быть относительным или абсолютным. Если файл с таким именем пути уже существует, системный вызов завершается с ошибкой EEXIST.

#include


int mkdir(const char *pathname, mode_t mode);

Возвращает 0 при успешном завершении или –1 при ошибке

Принадлежность нового каталога устанавливается в соответствии с правилами, описанными в подразделе 15.3.1.

Аргумент mode задает права доступа для нового каталога. (Мы описываем значение битов прав доступа для каталогов в подразделах 15.3.1, 15.3.2 и 15.4.5.) Эту битовую маску можно указать, применив операцию ИЛИ (|) с константами из табл. 15.4, но, как и для системного вызова open(), ее можно указать и восьмеричным числом. Значение, переданное в аргумент mode, объединяется с помощью операции И с маской процесса (подраздел 15.4.6). Кроме того, бит set-user-ID (S_ISUID) всегда отключен, поскольку для каталогов не имеет смысла.

Если в аргумент mode передан закрепляющий бит (S_ISVTX), то он будет установлен для нового каталога.

Значение бита set-group-ID (S_ISGID) в аргументе mode игнорируется. Вместо этого, если данный бит установлен для родительского каталога, он будет также установлен для нового каталога. В подразделе 15.3.1 было отмечено: установка бита прав доступа set-group-ID для каталога приводит к тому, что новые файлы, создаваемые в данном каталоге, заимствуют GID от идентификатора группы для каталога, а не от действующего GID для процесса. Системный вызов mkdir() распространяет бит прав доступа set-group-ID описанным здесь образом, чтобы все подкаталоги данного каталога вели себя одинаково.

Стандарт SUSv3 явно отмечает, что способ обращения системного вызова mkdir() с битами set-user-ID, set-group-ID и с закрепляющим битом определяется реализацией. В некоторых реализациях UNIX эти три бита всегда отключены для нового каталога.

Только что созданный каталог содержит две записи:. (точка), которая является ссылкой на сам каталог, и… (две точки) — это ссылка на родительский каталог.

Стандарт SUSv3 не требует наличия записей. и… в каталогах. Он требует лишь того, чтобы в реализации системы корректно интерпретировались эти точки, когда они появляются в именах путей. Портируемое приложение не должно полагаться на существование таких записей в каталоге.

Системный вызов mkdir() создает только последний компонент имени pathname. Другими словами, вызов mkdir("aaa/bbb/ccc", mode) завершится успешно, только если каталоги aaa и aaa/bbb уже существуют. (Это соответствует принятому по умолчанию действию команды mkdir(1), однако данная команда имеет также параметр — p для создания всех промежуточных имен каталогов, если они не существуют.)

GNU-библиотека C содержит функцию mkdtemp(template) — аналог функции mkstemp(), но для каталогов. Она создает каталог с уникальным именем, владельцу которого предоставлены права доступа на чтение, запись и выполнение, а всем остальным пользователям не предоставлено никаких прав. Вместо файлового дескриптора системный вызов mkdtemp() возвращает указатель на измененную строку, содержащую фактическое имя каталога в аргументе template. Стандарт SUSv3 не определяет эту функцию, и она недоступна во всех реализациях UNIX. Она определена в стандарте SUSv4.

Системный вызов rmdir() удаляет каталог, указанный в имени пути pathname, который может быть абсолютным или относительным.

#include


int rmdir(const char *pathname);

Возвращает 0 при успешном завершении или –1 при ошибке

Для успешного завершения системного вызова rmdir() необходимо, чтобы каталог был пустым. Если завершающий компонент имени pathname является символической ссылкой, она не разыменовывается; в результате возникает ошибка ENOTDIR.


18.7. Удаление файла или каталога: функция remove()


Библиотечная функция remove() удаляет файл или пустой каталог.

#include


int remove(const char *pathname);

Возвращает 0 при успешном завершении или –1 при ошибке

Если аргумент pathname представляет имя файла, то функция remove() выполняет системный вызов unlink(); если данный аргумент является каталогом, то функция remove() выполняет системный вызов rmdir().

Подобно системным вызовам unlink() и rmdir(), функция remove() не разыменовывает символические ссылки. Если аргумент pathname является такой ссылкой, то данная функция удаляет саму ссылку, а не файл, который соотносится с ней.

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных