MKNOD(2) | Руководство программиста Linux | MKNOD(2) |
mknod, mknodat - создаёт специальный или обычный файл
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>
int mknod(const char *pathname, mode_t mode, dev_t dev); #include <fcntl.h> /* определения констант AT_* */ #include <sys/stat.h>
int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev);
Требования макроса тестирования свойств для glibc (смотрите feature_test_macros(7)):
mknod():
Системный вызов mknod() создаёт запись (node) в файловой системе (обычный файл, файл устройства или именованный канал) с именем pathname и атрибутами, заданными в mode и dev.
В аргументе mode указывается используемый режим файла и тип создаваемого узла. В этом параметре должна быть битовая комбинация (используя побитовое логическое сложение ИЛИ) нуля или более режимов файла, перечисленных в inode(7).
Режим файла изменяется согласно значению umask процесса: при отсутствии списка контроля доступа по умолчанию права на создаваемый узел становятся равны (mode & ~umask).
Для указания обычного файла, специального символьного файла, специального блочного файла, FIFO (именованного канала) или доменного сокета UNIX типом должен быть один из S_IFREG, S_IFCHR, S_IFBLK, S_IFIFO или S_IFSOCK, соответственно (нулевой тип файла эквивалентен типу S_IFREG).
Если тип файла равен S_IFCHR или S_IFBLK, то в dev задаётся основной и вспомогательный номера создаваемого специального файла устройства (makedev(3) может оказаться полезной при создании значения для dev); в остальных случаях аргумент игнорируется.
Если pathname уже существует, или является символьной ссылкой, то вызов завершается с ошибкой EEXIST.
Созданный файл будет принадлежать ID эффективного владельца процесса. Если в правах доступа к каталогу, в котором находится файл, установлен бит set-group-ID, или если файловая система смонтирована с семантикой групп BSD, то новый файл унаследует группу-владельца от своего родительского каталога; в противном случае группой-владельцем станет ID эффективной группы процесса.
Системный вызов mknodat() работает также как системный вызов mknod(), за исключением случаев, описанных здесь.
Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в mknod()).
Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как mknod()).
Если в pathname задан абсолютный путь, то dirfd игнорируется.
Смотрите в openat(2) объяснение необходимости mknodat().
При успешном выполнении вызовов mknod() и mknodat() возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
В mknodat() дополнительно могут возникнуть следующие ошибки:
Вызов mknodat() был добавлен в ядро Linux версии 2.6.16; поддержка в glibc доступна с версии 2.4.
mknod(): SVr4, 4.4BSD, POSIX.1-2001 (но смотрите ниже), POSIX.1-2008.
mknodat(): POSIX.1-2008.
В POSIX.1-2001 сказано: «Единственный способ, которым можно использовать mknod() в переносимых программах это создание специального файла FIFO. Если значение mode не равно S_IFIFO или dev не равно 0, то поведение mknod() не определено.» Однако, в настоящее время никогда не используйте mknod() для этой цели; вместо этого используйте функцию mkfifo(3), которая создана специально для этого.
В Linux вызов mknod() не может использоваться для создания каталогов. Для этого есть системный вызов mkdir(2).
В протоколе, на котором работает NFS, есть множество недоработок. Некоторые из них влияют на mknod() и mknodat().
mknod(1), chmod(2), chown(2), fcntl(2), mkdir(2), mount(2), socket(2), stat(2), umask(2), unlink(2), makedev(3), mkfifo(3), acl(5) path_resolution(7)
2017-09-15 | Linux |