MKDIR(2) | Руководство программиста Linux | MKDIR(2) |
mkdir, 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():
Функция mkdir() пытается создать каталог с именем pathname.
В аргументе mode задаются права доступа к новому каталогу (смотрите inode(7)). Эти права стандартным образом изменяются с помощью согласно umask процесса: при отсутствии списка доступа по умолчанию права на созданный каталог будут рассчитаны как (mode & ~umask & 0777). Другие биты mode на создаваемый каталог зависят от операционной системы. Для Linux они описаны в ЗАМЕЧАНИЯХ.
Создаваемый каталог будет принадлежать фактическому владельцу процесса. Если у родительского каталога установлен флаг set-group-ID, или файловая система смонтирована с семантикой групп в стиле BSD (mount -o bsdgroups или, что одно и тоже, mount -o grpid), то новый каталог унаследует группу владельца от своего родительского каталога; в противном случае группой владельцем станет фактическая группа процесса.
Если у родительского каталога установлен бит set-group-ID, то он будет установлен также и у создаваемого каталога.
Системный вызов mkdirat() работает также как системный вызов mkdir(), за исключением случаев, описанных здесь.
Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в mkdir()).
Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как mkdir()).
Если в pathname задан абсолютный путь, то dirfd игнорируется.
Смотрите в openat(2) объяснение необходимости mkdirat().
При успешном выполнении вызовов mkdir() и mkdirat() возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
В mkdirat() дополнительно могут возникнуть следующие ошибки:
Вызов 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().
В старых ядрах, где mkdirat() отсутствует, обёрточная функция glibc использует mkdir(). Если pathname является относительным путём, то glibc собирает путь относительно символической ссылки в /proc/self/fd, которая соответствует аргументу dirfd.
mkdir(1), chmod(2), chown(2), mknod(2), mount(2), rmdir(2), stat(2), umask(2), unlink(2), acl(5) path_resolution(7)
2017-09-15 | Linux |