mknod(2) - Linux 手册页
名称
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():
- _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
描述
系统调用 mknod() 创建一个文件系统节点(文件、设备特殊文件或命名管道),命名为 pathname,其属性由 mode 和 dev 指定。
mode 参数同时指定要使用的权限和要创建的节点类型。它应该是由以下文件类型列表中的一种和新节点的权限的组合(使用按位或运算)。
权限会按照通常的方式被进程的 umask 修改:创建的节点的权限为 (mode & ~umask)。
文件类型必须是 S_IFREG、S_IFCHR、S_IFBLK、S_IFIFO 或 S_IFSOCK,分别指定常规文件(将被创建为空)、字符特殊文件、块特殊文件、FIFO(命名管道)或 UNIX 域套接字。(零文件类型等同于类型 S_IFREG。)
如果文件类型是 S_IFCHR 或 S_IFBLK,则 dev 指定新创建的设备特殊文件的主设备号和次设备号(makedev(3) 可能有助于构建 dev 的值);否则,它将被忽略。
如果 pathname 已经存在,或者是一个符号链接,则此调用将以 EEXIST 错误失败。
新创建的节点将由进程的有效用户 ID 拥有。如果包含该节点的目录设置了 set-group-ID 位,或者如果文件系统以 BSD 组语义挂载,则新节点将从其父目录继承组所有权;否则,它将由进程的有效组 ID 拥有。
返回值
mknod() 成功时返回零,如果发生错误则返回 -1(在这种情况下,errno 将被适当地设置)。
错误
- EACCES
父目录不允许进程具有写权限,或者 pathname 的路径前缀中的某个目录不允许搜索权限。(另请参阅 path_resolution(7)。)
EDQUOT
用户在文件系统上的磁盘块或 inode 配额已用尽。
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)