mkdir() - ディレクトリーの作成

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <sys/stat.h>

int mkdir(const char *pathname, mode_t mode);

機能説明

新規の空ディレクトリーの pathname を作成します。mode のファイル許可ビットは、プロセスの ファイル作成マスクで変更してから、作成中の ディレクトリーのファイル許可ビットを設定するのに 使用します。ファイル作成マスクについての詳細は、umask() - ファイル作成マスクの設定と検索を 参照してください。

mode 引数は、sys/stat.h ヘッダー・ファイル内で定義されるフラグの 1 つで作成されます。定義されていないモード・フラグはいずれもオフになり、関数は続行することを許可されます。
フラグ
説明
S_IRGRP
ファイルのグループ用の読み取り許可。
S_IROTH
ファイル所有者以外のユーザー用の読み取り許可。
S_IRUSR
ファイル所有者用の読み取り許可。
S_IRWXG
ファイルのグループ用の読み取り、書き込み、検索、または実行の許可。S_IRWXG は、S_IRGRP、S_IWGRP、および S_IXGRP のビット単位の包含 OR です。
S_IRWXO
ファイル所有者以外のユーザー用の 読み取り、書き込み、検索、または実行の許可。S_IRWXO は、S_IROTH、S_IWOTH、および S_IXOTH のビット単位の包含 OR です。
S_IRWXU
ファイル所有者用に読み取り、書き込み、および探索または実行を行います。S_IRWXU は、S_IRUSR、S_IWUSR、および S_IXUSR のビット単位の包含 OR です。
S_ISGID
実行用のグループ ID (GID) を設定する特権。このファイルが exec 関数により実行される場合は、プロセスの有効グループ ID がファイルのグループ ID に 設定されます。そのあとでプロセスは、実際の呼び出し元の権限ではなく、ファイル所有者と同じ権限を持ちます。
S_ISUID
実行用のユーザー ID (UID) を設定する特権。このファイルが exec 関数により実行される場合は、プロセスの有効ユーザー ID がファイルの所有者に 設定されます。そのあとでプロセスは、実際の呼び出し元の権限ではなく、ファイル所有者と同じ権限を持ちます。
S_ISVTX
共用テキストを指示します。実行可能ファイルとしてストレージにロードしたままにしてください。
S_IWGRP
ファイルのグループ用の書き込み許可。
S_IWOTH
ファイル所有者以外のユーザー用の書き込み許可。
S_IWUSR
ファイル所有者用の書き込み許可。
S_IXGRP
ファイルのグループ用の検索許可 (ディレクトリーの場合) または 実行許可 (ファイルの場合)。
S_IXOTH
ファイル所有者以外のユーザー用の検索許可 (ディレクトリーの場合) または実行許可 (ファイルの場合)。
S_IXUSR
ファイル所有者用の検索許可 (ディレクトリーの場合) または 実行許可 (ファイルの場合)。

新規ディレクトリーの所有者 ID は、プロセスの 有効ユーザー ID に設定されます。新規ディレクトリーのグループ ID は、所有ディレクトリー のグループ ID に設定されます。

mkdir() は、新規ディレクトリー用のアクセス、変更、および修正の回数を設定します。また、新規ディレクトリーが入っているディレクトリー用の 変更と修正の回数も設定します。

pathname にシンボリック・リンクの名前が設定されている場合、mkdir() は失敗します。

戻り値

正常に実行された場合、mkdir() は 0 を戻します。

正常終了しなかった場合、mkdir() は、ディレクトリーを作成しないで -1 を戻し、errno を以下の値のいずれかに設定します。
エラー・コード
説明
EACCES
プロセスには pathname の一部コンポーネントに関する 検索許可がありませんでした。あるいは、作成するディレクトリーの 親ディレクトリーに関する書き込み許可がありませんでした。
EEXIST
名前の付けられたファイルがシンボリック・リンクを示しているか、指定された pathname のファイルまたは ディレクトリーが既に存在します。
ELOOP
ループがシンボリック・リンクに存在しています。pathname の解決 で POSIX_SYMLOOP (limits.h ヘッダー・ファイルで 定義) を超えるシンボリック・リンクが検出されると、このエラーが 発行されます。
EMLINK
親ディレクトリーのリンク数 が LINK_MAX (limits.h ヘッダー・ファイルで 定義) に達しています。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathnamePATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代わりに使われる パス名のストリングの長さが PATH_MAX を超えています。PATH_MAX 値と NAME_MAX 値は 、pathconf() を使用して確認できます。
ENOENT
pathname の一部コンポーネントが存在しません。あるいは、pathname が空ストリングです。
ENOSPC
ファイル・システムに新規ディレクトリーを含むための十分なスペースがありません。あるいは、親ディレクトリーを拡張できません。
ENOTDIR
pathname の接頭部のコンポーネントが ディレクトリーではありません。
EROFS
作成されるディレクトリーの親ディレクトリーが読み取り専用ファイル・システム上にあります。

CELEBM16
⁄* CELEBM16

   The following example creates a new directory.

 *⁄
#define _POSIX_SOURCE
#include <sys⁄stat.h>
#include <unistd.h>
#undef _POSIX_SOURCE
#include <stdio.h>

main() {
  char new_dir[]="new_dir";

  if (mkdir(new_dir, S_IRWXU|S_IRGRP|S_IXGRP) != 0)
    perror("mkdir() error");
  else if (chdir(new_dir) != 0)
    perror("first chdir() error");
  else if (chdir("..") != 0)
    perror("second chdir() error");
  else if (rmdir(new_dir) != 0)
    perror("rmdir() error");
  else
    puts("success!");
}

関連情報