ИМЯ¶
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