mkdir 或 mkdirat 子例程

用途

创建目录。

标准 C 库 (libc.a)

语法

#include <sys/stat.h>
int mkdir (Path,  Mode)
const char *Path;
mode_t Mode;

int mkdirat (DirFileDescriptor, Path, Mode)
int DirFileDescriptor;
const char * Path;
mode_t Mode;

描述

mkdirmkdirat 子例程创建新目录。

新目录具有以下内容:

  • 所有者标识设置为流程有效用户标识。
  • 如果父目录设置了SetFileGroupID(S_ISGID) 属性,新目录将继承父目录的组 ID。 否则,新目录的组标识将设置为调用进程的有效组标识。
  • 根据 Mode 参数的值设置许可权和属性位,并进行以下修改:
    • 将清除进程文件方式创建掩码中设置的所有位。
    • SetFileUserIDSticky(S_ISVTX) 属性被清除。
  • 如果 Path 变量命名符号链接,那么将遵循该链接。 将在变量指向的位置创建新目录。

如果DirFileDescriptor参数设置为AT_FDCWD,或者Path参数为绝对路径名,则mkdirat子程序等同于mkdir子程序。 If the DirFileDescriptor parameter is a valid file descriptor of an open directory and the 路径 parameter is a relative path name, the 路径 parameter is considered as the relative path to the directory that is associated with the DirFileDescriptor parameter instead of the current working directory.

如果DirFileDescriptor参数在打开时未使用O_SEARCH打开标记,则子程序会使用目录的当前权限来检查是否允许对该目录进行目录搜索。 如果使用 O_SEARCH 打开标志打开目录,那么子例程不会对该目录执行检查。

参数

描述
路径 指定新目录的名称。 如果系统上安装了网络文件系统 (NFS) ,那么此路径可以跨入另一个节点。 在这种情况下,将在该节点上创建新目录。

要成功执行 mkdirmkdirat 子例程,进程必须对 Path 参数的父目录具有写许可权。

方式 指定所有者,组和其他用户的读,写和执行标志的掩码。 Mode 参数指定目录许可权和属性。 此参数由 <sys/mode.h> 文件中描述的逻辑 OR 运算值构造。
DirFileDescriptor 指定打开目录的文件描述符。

返回值

成功完成后, mkdirmkdirat 子例程将返回值 0。 否则,返回值为-1,并设置errno全局变量来指示错误。

错误代码

mkdirmkdirat 子例程不成功,如果下列其中一项或多项为 true ,那么不会创建目录:

描述
EACCES 创建请求的目录需要以拒绝写许可权的方式写入目录。
EEXIST 指定的文件已存在。
EROFS 指定的文件位于只读文件系统上。
ENOSPC 文件系统未包含足够的空间来存放新目录的内容或扩展新目录的父目录。
EMLINK 父目录的链接计数超过最大数目 (LINK_MAX)(LINK_MAX)limits.h 文件中定义。
ENAMETOOLONG Path 参数或路径组件太长,无法截断。
ENOENT 路径前缀的组件不存在,或者 Path 参数指向空字符串。
ENOTDIR 路径前缀的组件不是目录。
EDQUOT 无法扩展放置新目录条目的目录,或者无法为新目录分配索引节点或磁盘块,因为包含该目录的文件系统上的用户或组的磁盘块或索引节点配额已耗尽。

如果下列一个或多个设置为 true ,那么 mkdirat 子例程不成功:

描述
EBADF 路径参数没有指定绝对路径,DirFileDescriptor参数既不是AT_FDCWD,也不是有效的文件描述符。
ENOTDIR 路径参数没有指定绝对路径,"DirFileDescriptor参数既不是 "AT_FDCWD,也不是与目录相关的文件描述符。

由于其他原因, mkdirmkdirat 子例程可能不成功。 请参阅 "附录 A. 需要路径-名称解析的服务的基本操作系统错误代码" ,以获取其他错误的列表。

如果在系统上安装了 NFS ,那么如果满足以下条件,那么 mkdirmkdirat 子例程也将失败:

描述
ETIMEDOUT 连接超时。