Системный вызов
mknod
создат запись inode в файловой системе (обычный файл, файл устройства
или именованый канал) с именем
pathname,
с атрибутами, определяемыми параметрами
mode
и
dev.
Параметр
mode
задает как права доступа, так и тип создаваемой записи.
В этом параметре содержится битовая комбинация (используя побитовое
логическое сложение OR) одного из нижеперечисленных типов файлов и прав
доступа для нового узла. Права доступа изменяются, при этом значение
umask
процесса используется обычным способом: права доступа становятся равны
(mode & ~umask).
Тип файла должен быть
S_IFREG,
S_IFCHR,
S_IFBLK,
S_IFIFO
or
S_IFSOCK
для определения обычного файла (он будет создан пустым), особого
символьного файла, особого блочного файла, FIFO (именованного канала)
или доменного сокета Unix соответственно.
(Пустой тип файла эквивалентно указанию типа S_IFREG.)
Если тип файла -
S_IFCHR или S_IFBLK,
то
dev
задает основной и вспомогательный номера создаваемого файла устройства; в
остальных случаях параметр игнорируется.
Если
pathname
уже существует, или является символьной ссылкой, то вызов завершается с ошибкой EEXIST.
Созданный файл будет принадлежать фактическому владельцу
процесса. Если в правах доступа к каталогу, в котором находится файл,
установлен бит setgid, или если файловая система смонтирована с
семантикой групп BSD, то новый файл унаследует группу-владельца от
своего родительского каталога; в противном случае группой-владельцем
станет фактическая группа процесса.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При успешном завершении
работы
mknod
возвращаемое значение равно нулю, в случае ошибки оно равно -1 и переменная
errno
приобретает соответствующее значение.
НАЙДЕННЫЕ ОШИБКИ
EPERM
mode
запросило создание не обычного файла, не именованного канала FIFO,
не доменного сокета Unix, а чего-то другого, и при этом вывавший
не является суперпользователем; также возвращается если файловая
система, содержащая
pathname
не поддерживает запрошенный типа записи inode.
EINVAL
В параметре
mode
запрошено создание неизвестного типа файла.
EEXIST
pathname
уже существует.
EFAULT
pathname
указывает на каталог за пределами доступного адресного пространства.
EACCES
Родительский каталог не дает процессу прав на запись, или же один из
каталогов в
pathname
не дает прав на поиск (выполнение).
ENAMETOOLONG
pathname
слишком длинно.
ENOENT
Компонент пути
pathname
не существует или является "висячей" символьной ссылкой.
ENOTDIR
Компонент пути, использованный как каталог в
pathname,
в действительности таковым не является.
ENOMEM
Недостаточно памяти в системе.
EROFS
pathname
ссылается на файл,
находящийся в файловой системе, предназначенной только для чтения.
ELOOP
pathname
является зацикленной символьной ссылкой, то есть при соответствующей подстановке
возникает ссылка на неё саму.
ENOSPC
На устройстве, содержащем
pathname,
нет места для создания нового файла.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4 (этот системный вызов требует привилегий, поэтому не упомянут в POSIX),
4.4BSD. Версия Linux отличается от версии SVr4 тем, что не требует
прав суперпользователя для создания каналов FIFO, а также тем, что не
описывает коды ошибок EMULTIHOP, ENOLINK и EINTR.
ЗАМЕЧАНИЯ
Стандарт POSIX 1003.1-2001 гласит: "Единственно, как можно использовать
mknod()
в переносимых программах - это создавать специальные FIFO-файлы. Если
mode
на является S_IFIFO или
dev
не равно 0, то поведение
mknod()
неопределено."
В Linux этот вызов не может использоваться для создания каталогов.
Создавать каталоги необходимо, используя
mkdir,
а каналы FIFO - используя
mkfifo.
В протоколе, по которому работает NFS, содержится множество недоработок.
Некоторые из них влияют на
mknod.