MKNOD - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-08-13
名称
mknod,mknodat-创建特殊文件或普通文件
语法
#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); #include <fcntl.h> /* Definition of AT_* constants */ #include <sys/stat.h> int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
mknod():
- _XOPEN_SOURCE>= 500 || / *自glibc 2.19起:* / -_DEFAULT_SOURCE || / * Glibc版本
说明
系统调用mknod()创建一个名为pathname的文件系统节点(文件,设备专用文件或命名管道),其属性由mode和dev指定。
mode参数指定要使用的文件模式和要创建的节点类型。它应该是下面列出的一种文件类型与inode(7)中列出的零个或多个文件模式位的组合(使用按位或)。
文件模式由进程的umask以通常的方式修改:在没有默认ACL的情况下,创建的节点的权限为(mode&ti umask)。
文件类型必须为S_IFREG,S_IFCHR,S_IFBLK,S_IFIFO或S_IFSOCK中的一种,以分别指定常规文件(将创建为空),字符特殊文件,块特殊文件,FIFO(命名管道)或UNIX域套接字。 。 (零文件类型等效于S_IFREG类型。)
如果文件类型是S_IFCHR或S_IFBLK,则dev指定新创建的设备专用文件的主要和次要编号(makedev(3)可能对于构建dev的值很有用);否则将被忽略。
如果路径名已经存在或是符号链接,则此调用将失败并显示EEXIST错误。
新创建的节点将由该进程的有效用户ID拥有。如果包含该节点的目录设置了set-group-ID位,或者如果文件系统是使用BSD组语义安装的,则新节点将从其父目录继承该组所有权;否则,它将归进程的有效组ID拥有。
mknodat()
mknodat()系统调用的操作与mknod()完全相同,除了此处所述的区别。
如果在路径名中给定的路径名是相对的,则它相对于文件描述符dirfd所引用的目录进行解释(而不是相对于调用进程的当前工作目录,如相对路径名的mknod()所做的那样) 。
如果路径名是相对的并且dirfd是特殊值AT_FDCWD,则路径名将相对于调用进程的当前工作目录进行解释(如mknod())。
如果路径名是绝对的,则dirfd被忽略。
有关对mknodat()的需求的说明,请参见openat(2)。
返回值
mknod()和mknodat()成功返回零;如果发生错误,则返回-1(在这种情况下,将errno进行适当设置)。
错误说明
- EACCES
- 父目录不允许对该进程进行写许可,或者路径名的路径前缀中的目录之一不允许搜索许可。 (另请参见path_resolution(7)。)
- EDQUOT
- 用户对文件系统上的磁盘块或索引节点的配额已用尽。
- EEXIST
- 路径名已存在。这包括路径名是符号链接(是否悬挂)的情况。
- EFAULT
- 路径名指向您可访问的地址空间之外。
- EINVAL
- 模式要求创建除常规文件,设备专用文件,FIFO或套接字之外的其他内容。
- ELOOP
- 解析路径名时遇到太多符号链接。
- ENAMETOOLONG
- 路径名太长。
- ENOENT
- 路径名中的目录组件不存在或为悬挂的符号链接。
- ENOMEM
- 内核内存不足。
- ENOSPC
- 包含路径名的设备没有空间容纳新节点。
- ENOTDIR
- 实际上,在路径名中用作目录的组件不是目录。
- EPERM
- 模式要求创建除常规文件,FIFO(命名管道)或UNIX域套接字之外的其他内容,并且调用者没有特权(Linux:不具有CAP_MKNOD功能);如果包含路径名的文件系统不支持请求的节点类型,则也返回。
- EROFS
- 路径名是指只读文件系统上的文件。
mknodat()可能会发生以下其他错误:
- EBADF
- dirfd不是有效的文件描述符。
- ENOTDIR
- pathname是相对的,dirfd是引用目录以外的文件的文件描述符。
版本
mknodat()在内核2.6.16中添加到Linux;库支持已添加到版本2.4中的glibc。
遵循规范
mknod():SVr4、4.4BSD,POSIX.1-2001(但请参见下文),POSIX.1-2008。
mknodat():POSIX.1-2008。
备注
POSIX.1-2001说:" mknod()的唯一可移植用途是创建FIFO专用文件。如果mode不是S_IFIFO或dev不为0,则mknod()的行为未指定。"但是,如今,永远不要为此目的使用mknod();一个人应该使用mkfifo(3),这是为此目的专门定义的功能。
在Linux下,不能使用mknod()创建目录。应该用mkdir(2)来建立目录。
NFS底层协议有很多不足之处。其中一些会影响mknod()和mknodat()。
另外参见
mknod(1),chmod(2),chown(2),fcntl(2),mkdir(2),mount(2),socket(2),stat(2),umask(2),unlink(2), makedev(3),mkfifo(3),acl(5),path_resolution(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。