Scroll to navigation

MKNOD(2) Руководство программиста Linux MKNOD(2)

ИМЯ

mknod - создает специальный или обычный файл

ОБЗОР

#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);


Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

mknod():

_BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

ОПИСАНИЕ

Системный вызов mknod() создаёт запись (node) в файловой системе (обычный файл, файл устройства или именованный канал) с именем pathname и атрибутами, заданными в mode и dev.

Аргумент mode задает как права доступа, так и тип создаваемой записи. В этом параметре содержится битовая комбинация (используя побитовое логическое сложение OR) одного из нижеперечисленных типов файлов и прав доступа для новой записи.

При изменении прав доступа учитывается значение umask процесса: права доступа создаваемой записи становятся равны (mode & ~umask).

Тип файла должно быть одним из: S_IFREG (обычный файл, создаётся пустым), S_IFCHR (специальный символьный файл), S_IFBLK (специальный блочный файл), S_IFIFO (именованный канал) или S_IFSOCK (доменный сокет UNIX). Тип файла со значением 0 соответствует типу S_IFREG.

Если тип файла равен S_IFCHR или S_IFBLK, то в dev задаётся основной и вспомогательный номера создаваемого специального файла устройства (makedev(3) может оказаться полезной при создании значения для dev); в остальных случаях аргумент игнорируется.

Если pathname уже существует, или является символьной ссылкой, то вызов завершается с ошибкой EEXIST.

Созданный файл будет принадлежать ID эффективного владельца процесса. Если в правах доступа к каталогу, в котором находится файл, установлен бит set-group-ID, или если файловая система смонтирована с семантикой групп BSD, то новый файл унаследует группу-владельца от своего родительского каталога; в противном случае группой-владельцем станет ID эффективной группы процесса.

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

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

ОШИБКИ

У процесса нет прав на запись в родительский каталог, или в одном из каталогов в pathname не разрешён поиск (см. также path_resolution(7)).
pathname уже существует. В этом случае pathname может быть символьной ссылкой, повисшей или нет.
Аргумент pathname указывает за пределы доступного адресного пространства.
В аргументе mode указано значение, отличное от значения для обычного файла, специального файла устройства, FIFO или сокета.
Во время определения pathname встретилось слишком много символьных ссылок.
pathname слишком длинен.
Один из каталогов в pathname не существует или является повисшей символьной ссылкой.
Недостаточное количество памяти ядра.
На устройстве, содержащем pathname, нет места для создания нового элемента.
Компонент пути, использованный как каталог в pathname, в действительности таковым не является.
В аргументе mode запрошено создание чего-то, отличного от обычного файла, специального файла устройства, FIFO (именованного канала) или доменного сокета UNIX, и у вызвавшего процесса нет прав (Linux: не имеет мандата CAP_MKNOD); также завершается, если файловая система, содержащая pathname, не поддерживает тип запрашиваемой ноды.
pathname находится на файловой системе, доступной только для чтения.

СООТВЕТСТВИЕ СТАНДАРТАМ

SVr4, 4.4BSD, POSIX.1-2001 (смотрите далее).

ЗАМЕЧАНИЯ

В POSIX.1-2001 сказано: "Единственный способ, которым можно использовать mknod() в переносимых программах это создание специального файла FIFO. Если значение mode не равно S_IFIFO или dev не равно 0, то поведение mknod() не определено." Однако, в настоящее время никогда не используйте mknod() для этой цели; вместо этого используйте функцию mkfifo(3), которая создана специально для этого.

В Linux этот вызов не может использоваться для создания каталогов. Для создания каталогов есть системный вызов mkdir(2).

В протоколе, по которому работает NFS, содержится множество недоработок. Некоторые из них влияют на mknod().

СМОТРИТЕ ТАКЖЕ

chmod(2), chown(2), fcntl(2), mkdir(2), mknodat(2), mount(2), socket(2), stat(2), umask(2), unlink(2), makedev(3), mkfifo(3), path_resolution(7)

2010-09-20 Linux