Главная » 2017 » Ноябрь » 21 » man 2 mknodat
00:53
man 2 mknodat

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


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():
_XOPEN_SOURCE >= 500
|| /* Since glibc 2.19: */ _DEFAULT_SOURCE
|| /* Glibc versions <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE



ОПИСАНИЕ


Системный вызов 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()
Системный вызов mknodat() работает также как системный вызов mknod(), за

Если в pathname задан абсолютный путь, то dirfd игнорируется.

Смотрите в openat(2) объяснение необходимости mknodat().



ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ


При успешном выполнении вызовов mknod() и mknodat() возвращается 0. В случае
ошибки возвращается -1, а errno устанавливается в соответствующее значение.



ОШИБКИ


EACCES У процесса нет прав на запись в родительский каталог, или в одном из
каталогов в pathname не разрешён поиск (смотрите также path_resolution(7)).

EDQUOT Исчерпана пользовательская квота на дисковые блоки или иноды файловой
системы.

EEXIST pathname уже существует. В этом случае pathname может быть символьной
ссылкой, повисшей или нет.

EFAULT Аргумент pathname указывает за пределы доступного адресного пространства.

EINVAL В аргументе mode указано значение, отличное от значения для обычного файла,
специального файла устройства, FIFO или сокета.

ELOOP Во время определения pathname встретилось слишком много символьных ссылок.

ENAMETOOLONG
pathname слишком длинен.

ENOENT Один из каталогов в pathname не существует или является повисшей символьной
ссылкой.

ENOMEM Недостаточное количество памяти ядра.

ENOSPC На устройстве, содержащем pathname, нет места для создания нового элемента.

ENOTDIR
Компонент пути, использованный как каталог в pathname, в действительности
таковым не является.

EPERM В аргументе mode запрошено создание чего-то, отличного от обычного файла,
специального файла устройства, FIFO (именованного канала) или доменного
сокета UNIX, и у вызвавшего процесса нет прав (Linux: не имеет мандата
CAP_MKNOD); также завершается, если файловая система, содержащая pathname,
не поддерживает тип запрашиваемой ноды.

EROFS pathname указывает на файл в файловой системе, доступной только для чтения.

В mknodat() дополнительно могут возникнуть следующие ошибки:

EBADF dirfd не является правильным файловым дескриптором.

ENOTDIR
Значение pathname содержит относительный путь и dirfd содержит файловый
дескриптор, указывающий на файл, а не на каталог.



ВЕРСИИ


В 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)



Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 360 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar