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

ОПИСАНИЕ
Системный вызов mknod создаёт узел файловой системы (файл, специальный файл устройства или именованный канал) с именем pathname и с атрибутами, которые задаются через mode и dev. Аргумент mode задает как права доступа, так и тип узла, который нужно создать. Аргумент должен быть комбинацией (битовое сложение OR) одного из нижеперечисленных типов файлов и прав доступа для нового узла. Права доступа изменяются значением umask процесса в обычном порядке: права создаваемого узла будут (mode & ~umask). Тип файла должен быть одним из значений: S_IFREG, S_IFCHR, S_IFBLK, S_IFIFO или S_IFSOCK которые опрделяют соответственно обычный файл (который будет создан пустым), специальный символьный файл, специальный блочный файл, FIFO (именованный канал) или доменный сокет Unix. (Ноль в типе файла эквивалентен типу S_IFREG.) Если тип файла S_IFCHR или S_IFBLK, то аргумент dev задает старший (major) и младший (minor) номера создаваемого файла устройства; в остальных случаях этого аргумент игнорируется. Если pathname уже существует или является символьной ссылкой, вызов звершится с ошибкой EEXIST. Владелец созданного узла будет установлен соласно эффективному идентификатору пользователя процесса, из которого был выполнен вызов. Если в правах доступа к каталогу, в котором находится узел, установлен бит setgid, или если файловая система смонтирована с семантикой групп BSD, то новый узел унаследует группу-владельца от своего родительского каталога; в противном случае группой-владельцем станет группа соответствующая эффективному идентификатору группы процесса.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха mknod возвращает ноль, в случае ошибки возвращается -1 и значение errno устанавливается соответствующим образом.

ОШИБКИ

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

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

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 версии в том, что не требует привелегий суперпользователя для создания каналов, а также в том, что не документируются ошибки EMULTIHOP, ENOLINK и EINTR.

ЗАМЕЧАНИЯ
POSIX 1003.1-2001 говорит: "Переносимым на другие платформы использованием вызова mknod() является только создание FIFO файлов. Если mode не S_IFIFO или dev не 0, поведение mknod() является неопределённым." Под Linux данный вызов не может быть использован для создания каталогов. Для этого нужно использовать mkdir, а FIFO могут создаваться вызовом mkfifo. Существует множество погрешностей в протоколе при использовании NFS. Некоторые из них влияют на mknod.

СМОТРИ ТАКЖЕ
fcntl(2), mkdir(2), mount(2), socket(2), stat(2), umask(2), unlink(2), mkfifo(3)

ПЕРЕВОД
Перевёл с английского Виктор Вислобоков <corochoone@perm.ru> 2004