mknod

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

ОПИСАНИЕ
       Системный вызов 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



Linux 2.4                          2003-04-23                           MKNOD(2)