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,其属性由 modedev 指定。

mode 参数同时指定要使用的权限和要创建的节点类型。它应该是由以下文件类型列表中的一种和新节点的权限的组合(使用按位或运算)。

权限会按照通常的方式被进程的 umask 修改:创建的节点的权限为 (mode & ~umask)

文件类型必须是 S_IFREGS_IFCHRS_IFBLKS_IFIFOS_IFSOCK,分别指定常规文件(将被创建为空)、字符特殊文件、块特殊文件、FIFO(命名管道)或 UNIX 域套接字。(零文件类型等同于类型 S_IFREG。)

如果文件类型是 S_IFCHRS_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_IFIFOdev 不是 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)

引用自

acl(5), capabilities(7), explain(1), explain(3), explain_mknod(3), explain_mknod_or_die(3), guestfish(1), guestfs(3), hylafax-server(5), mkfifoat(3), mknod(1), mksh(1), open(2), remove(3), tar_extract_regfile(3), xfs_db(8)