ИМЯ
mknod, mknodat - создаёт специальный или обычный файлLIBRARY
Standard C library ( libc, -lc)СИНТАКСИС
#include <sys/stat.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():
_XOPEN_SOURCE >= 500 || /* Since glibc 2.19: */ _DEFAULT_SOURCE || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
ОПИСАНИЕ
Системный вызов mknod() создаёт запись (node) в файловой системе (обычный файл, файл устройства или именованный канал) с именем pathname и атрибутами, заданными в mode и dev. В аргументе mode указывается используемый режим файла и тип создаваемого узла. В этом параметре должна быть битовая комбинация (используя побитовое логическое сложение ИЛИ) нуля или более режимов файла, перечисленных в inode(7). The file mode is modified by the process's umask in the usual way: in the absence of a default ACL, the permissions of the created node are ( 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()
Системный вызов mknodat() работает также как системный вызов mknod(), за исключением случаев, описанных здесь. Если в pathname задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в mknod()). Если в pathname задан относительный путь и dirfd равно специальному значению AT_FDCWD, то pathname рассматривается относительно текущего рабочего каталога вызывающего процесса (как mknod()). Если в pathname задан абсолютный путь, то dirfd игнорируется. Смотрите в openat(2) объяснение необходимости mknodat().ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
mknod() and mknodat() return zero on success. On error, -1 is returned and errno is set to indicate the error.ОШИБКИ
- EACCES
- У процесса нет прав на запись в родительский каталог, или в одном из каталогов в pathname не разрешён поиск (смотрите также path_resolution(7)).
- EBADF
- (mknodat()) pathname is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.
- EDQUOT
- Исчерпана пользовательская квота на дисковые блоки или иноды файловой системы.
- EEXIST
- pathname уже существует. В этом случае pathname может быть символьной ссылкой, повисшей или нет.
- EFAULT
- Аргумент pathname указывает за пределы доступного адресного пространства.
- EINVAL
- В аргументе mode указано значение, отличное от значения для обычного файла, специального файла устройства, FIFO или сокета.
- ELOOP
- Во время определения pathname встретилось слишком много символьных ссылок.
- ENAMETOOLONG
- pathname слишком длинен.
- ENOENT
- Один из каталогов в pathname не существует или является повисшей символьной ссылкой.
- ENOMEM
- Недостаточное количество памяти ядра.
- ENOSPC
- На устройстве, содержащем pathname, нет места для создания нового элемента.
- ENOTDIR
- Компонент пути, использованный как каталог в pathname, в действительности таковым не является.
- ENOTDIR
- (mknodat()) Значение pathname содержит относительный путь и dirfd содержит файловый дескриптор, указывающий на файл, а не на каталог.
- EPERM
- В аргументе mode запрошено создание чего-то, отличного от обычного файла, специального файла устройства, FIFO (именованного канала) или доменного сокета UNIX, и у вызвавшего процесса нет прав (Linux: не имеет мандата CAP_MKNOD); также завершается, если файловая система, содержащая pathname, не поддерживает тип запрашиваемой ноды.
- EROFS
- pathname указывает на файл в файловой системе, доступной только для чтения.
ВЕРСИИ
mknodat() was added in Linux 2.6.16; library support was added in 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)ПЕРЕВОД
Русский перевод этой страницы руководства был сделан aereiae <[email protected]>, Alexey <[email protected]>, Azamat Hackimov <[email protected]>, Dmitriy S. Seregin <[email protected]>, Dmitry Bolkhovskikh <[email protected]>, ITriskTI <[email protected]>, Max Is <[email protected]>, Yuri Kozlov <[email protected]>, Иван Павлов <[email protected]> и Малянов Евгений Викторович <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]5 февраля 2023 г. | Linux man-pages 6.03 |