table of contents
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);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
mknod():
ОПИСАНИЕ¶
Системный вызов mknod() создаёт запись (node) в файловой системе (обычный файл, файл устройства или именованный канал) с именем pathname и атрибутами, заданными в mode и dev.
Аргумент mode задает как права доступа, так и тип создаваемой записи. В этом параметре содержится битовая комбинация (используя побитовое логическое сложение OR) одного из нижеперечисленных типов файлов и прав доступа для новой записи.
При изменении прав доступа учитывается значение umask процесса: права доступа создаваемой записи становятся равны (mode & ~umask).
Тип файла должно быть одним из: S_IFREG (обычный файл, создаётся пустым), S_IFCHR (специальный символьный файл), S_IFBLK (специальный блочный файл), S_IFIFO (именованный канал) или S_IFSOCK (доменный сокет UNIX). Тип файла со значением 0 соответствует типу S_IFREG.
Если тип файла равен S_IFCHR или S_IFBLK, то в dev задаётся основной и вспомогательный номера создаваемого специального файла устройства (makedev(3) может оказаться полезной при создании значения для dev); в остальных случаях аргумент игнорируется.
Если pathname уже существует, или является символьной ссылкой, то вызов завершается с ошибкой EEXIST.
Созданный файл будет принадлежать ID эффективного владельца процесса. Если в правах доступа к каталогу, в котором находится файл, установлен бит set-group-ID, или если файловая система смонтирована с семантикой групп BSD, то новый файл унаследует группу-владельца от своего родительского каталога; в противном случае группой-владельцем станет ID эффективной группы процесса.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ¶
При успешном выполнении функции mknod() возвращается 0. В случае ошибки возвращается -1, а errno устанавливается в соответствующее значение.
ОШИБКИ¶
- EACCES
- У процесса нет прав на запись в родительский каталог, или в одном из каталогов в pathname не разрешён поиск (см. также path_resolution(7)).
- EEXIST
- pathname уже существует. В этом случае pathname может быть символьной ссылкой, повисшей или нет.
- EFAULT
- Аргумент pathname указывает за пределы доступного адресного пространства.
- EINVAL
- В аргументе mode указано значение, отличное от значения для обычного файла, специального файла устройства, FIFO или сокета.
- ELOOP
- Во время определения pathname встретилось слишком много символьных ссылок.
- ENAMETOOLONG
- pathname слишком длинен.
- ENOENT
- Один из каталогов в pathname не существует или является повисшей символьной ссылкой.
- ENOMEM
- Недостаточное количество памяти ядра.
- ENOSPC
- На устройстве, содержащем pathname, нет места для создания нового элемента.
- ENOTDIR
- Компонент пути, использованный как каталог в pathname, в действительности таковым не является.
- EPERM
- В аргументе mode запрошено создание чего-то, отличного от обычного файла, специального файла устройства, FIFO (именованного канала) или доменного сокета UNIX, и у вызвавшего процесса нет прав (Linux: не имеет мандата CAP_MKNOD); также завершается, если файловая система, содержащая pathname, не поддерживает тип запрашиваемой ноды.
- EROFS
- pathname находится на файловой системе, доступной только для чтения.
СООТВЕТСТВИЕ СТАНДАРТАМ¶
SVr4, 4.4BSD, POSIX.1-2001 (смотрите далее).
ЗАМЕЧАНИЯ¶
В POSIX.1-2001 сказано: "Единственный способ, которым можно использовать mknod() в переносимых программах это создание специального файла FIFO. Если значение mode не равно S_IFIFO или dev не равно 0, то поведение mknod() не определено." Однако, в настоящее время никогда не используйте mknod() для этой цели; вместо этого используйте функцию mkfifo(3), которая создана специально для этого.
В Linux этот вызов не может использоваться для создания каталогов. Для создания каталогов есть системный вызов mkdir(2).
В протоколе, по которому работает NFS, содержится множество недоработок. Некоторые из них влияют на mknod().
СМОТРИТЕ ТАКЖЕ¶
chmod(2), chown(2), fcntl(2), mkdir(2), mknodat(2), mount(2), socket(2), stat(2), umask(2), unlink(2), makedev(3), mkfifo(3), path_resolution(7)
2010-09-20 | Linux |