Other Alias
mkdiratОБЗОР
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);
#include <fcntl.h> /* определения констант AT_* */
#include <sys/stat.h>
int mkdirat(int dirfd, const char *pathname, mode_t mode);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
mkdirat():
-
- Начиная с glibc 2.10:
- _XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
- До glibc 2.10:
- _ATFILE_SOURCE
ОПИСАНИЕ
Функция mkdir() пытается создать каталог с именем pathname.В аргументе mode задаются права доступа к новому каталогу (смотрите stat(2)). Эти права стандартным образом изменяются с помощью согласно umask процесса: при отсутствии списка доступа по умолчанию права на созданный каталог будутрассчитаны как (mode & ~umask & 0777). Другие биты mode прав на создаваемый каталог зависят от операционной системы. Для Linux они описаны в ЗАМЕЧАНИЯХ.
Создаваемый каталог будет принадлежать фактическому владельцу процесса. Если у родительского каталога установлен флаг set-group-ID, или файловая система смонтирована с семантикой групп в стиле BSD (mount -o bsdgroups или, что одно и тоже, mount -o grpid), то новый каталог унаследует группу владельца от своего родительского каталога; в противном случае группой владельцем станет фактическая группа процесса.
Если у родительского каталога установлен бит set-group-ID, то он будет установлен также и у создаваемого каталога.
mkdirat()
Системный вызов mkdirat() работает также как системный вызов mkdir(), за исключением случаев, описанных здесь.Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в mkdir()).
Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как mkdir()).
Если в pathname задан абсолютный путь, то dirfd игнорируется.
Смотрите в openat(2) объяснение необходимости mkdirat().
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении вызовов mkdir() и mkdirat() возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.ОШИБКИ
- EACCES
- У процесса нет прав на запись в родительский каталог, или в одном из каталогов в pathname не разрешён поиск (см. также path_resolution(7)).
- EDQUOT
- Исчерпана пользовательская квота на дисковые блоки или иноды файловой системы.
- EEXIST
- pathname уже существует (и необязательно как каталог). В этом случае pathname может быть символьной ссылкой, повисшей или нет.
- EFAULT
- Аргумент pathname указывает за пределы доступного адресного пространства.
- ELOOP
- Во время определения pathname встретилось слишком много символьных ссылок.
- EMLINK
- Количество ссылок на родительский каталог превысило бы LINK_MAX.
- ENAMETOOLONG
- pathname слишком длинен.
- ENOENT
- Один из каталогов в pathname не существует или является повисшей символьной ссылкой.
- ENOMEM
- Недостаточное количество памяти ядра.
- ENOSPC
- На устройстве, содержащем pathname, нет места для создания нового каталога.
- ENOSPC
- Новый каталог не может быть создан, так как превышена пользовательская дисковая квота.
- ENOTDIR
- Компонент пути, использованный как каталог в pathname, в действительности таковым не является.
- EPERM
- Файловая система, содержащая pathname, не поддерживает создание каталогов.
- EROFS
- pathname указывает на файл в файловой системе, доступной только для чтения.
В mkdirat() дополнительно могут возникнуть следующие ошибки:
- EBADF
- dirfd не является правильным файловым дескриптором.
- ENOTDIR
- Значение pathname содержит относительный путь и dirfd содержит файловый дескриптор, указывающий на файл, а не на каталог.
ВЕРСИИ
Вызов mkdirat() был добавлен в ядро Linux версии 2.6.16; поддержка в glibc доступна с версии 2.4.СООТВЕТСТВИЕ СТАНДАРТАМ
mkdir(): SVr4, BSD, POSIX.1-2001, POSIX.1-2008.mkdirat(): POSIX.1-2008.
ЗАМЕЧАНИЯ
В Linux кроме битов прав, в mode учитывается также бит S_ISVTX.В протоколе, на котором работает NFS, есть множество недоработок. Некоторые из них влияют на mkdir().