MKNOD - Linux手册页

时间:2019-08-20 17:59:00  来源:igfitidea点击:

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_IFREGS_IFCHRS_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/