В стандарте SUSv2 для значения, возвращаемого системным вызовом readlink(), указан тип int, и многие современные реализации (а также версии Linux на основе библиотеки glibc) следуют этой спецификации. В стандарте SUSv3 тип возвращаемого значения изменен на ssize_t.
Системный вызов mkdir() создает новый каталог.
Аргумент pathname задает имя пути для нового каталога. Оно может быть относительным или абсолютным. Если файл с таким именем пути уже существует, системный вызов завершается с ошибкой EEXIST.
#include
int mkdir(const char *
Возвращает 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 *
Возвращает 0 при успешном завершении или –1 при ошибке
Для успешного завершения системного вызова rmdir() необходимо, чтобы каталог был пустым. Если завершающий компонент имени pathname является символической ссылкой, она не разыменовывается; в результате возникает ошибка ENOTDIR.
Библиотечная функция remove() удаляет файл или пустой каталог.
#include
int remove(const char *
Возвращает 0 при успешном завершении или –1 при ошибке
Если аргумент pathname представляет имя файла, то функция remove() выполняет системный вызов unlink(); если данный аргумент является каталогом, то функция remove() выполняет системный вызов rmdir().
Подобно системным вызовам unlink() и rmdir(), функция remove() не разыменовывает символические ссылки. Если аргумент pathname является такой ссылкой, то данная функция удаляет саму ссылку, а не файл, который соотносится с ней.