mknod() - Unix,Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

mknod() - Unix,Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

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);

描述

系统调用 mknod() 创建一个名为 pathname 的文件系统节点(文件、设备特殊文件或命名管道),其属性由 modedev 指定。

mode 参数指定要使用的权限和要创建的节点类型。它应该是下面列出的文件类型之一与新节点的权限的组合(使用按位或)。

权限以通常的方式由进程的 umask 修改:创建的节点的权限为 (mode & ~umask)

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

如果文件类型是 S_IFCHRS_IFBLK,则 dev 指定新创建的设备特殊文件的 major 和 minor 编号;否则忽略它。

如果 pathname 已经存在或是一个符号链接,则此调用将失败并出现 EEXIST 错误。

新创建的节点将由进程的有效用户 ID 拥有。如果包含该节点的目录设置了 set-group-ID 位,或者如果文件系统以 BSD 组语义挂载,则新节点将从其父目录继承组所有权;否则,它将由进程的有效组 ID 拥有。

返回值

mknod() 在成功时返回零,如果发生错误则返回 -1(在这种情况下,errno 被适当设置)。

错误

标签描述
EACCES 父目录不允许进程写入权限,或者 pathname 的路径前缀中的一个目录不允许搜索权限。(另请参见 path_resolution(2)。)
EEXIST 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() 的行为未定义。”

在 Linux 下,此调用不能用于创建目录。应该使用 mkdir(2) 创建目录,使用 mkfifo(2) 创建 FIFO。

NFS 底层协议中存在许多不完善之处。其中一些会影响 mknod()。

参见



previous next Printer Friendly

广告


  

广告



广告