ИМЯ
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 [AT] perm.ru> 2004