mkdirat(2) ディレクトリを作成する

Other Alias

mkdir

書式

#include <sys/stat.h>
#include <sys/types.h>


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

#include <fcntl.h> /* AT_* 定数の定義 */
#include <sys/stat.h>

int mkdirat(int dirfd, const char *pathname, mode_t mode);

glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):

mkdirat():

glibc 2.10 以降:
_XOPEN_SOURCE >= 700 || _POSIX_C_SOURCE >= 200809L
glibc 2.10 より前:
_ATFILE_SOURCE

説明

mkdir() は pathname で示される名前のディレクトリを作成しようとする。

mode 引き数は、作成されたディレクトリの許可属性を決定するのに使われる。 この値に、通常通りプロセスの umask による修正が加えられる。 したがって、作成されたディレクトリの許可属性は (mode & ~umask & 0777) となる。 作成されたディレクトリのその他のモードビットはオペレーティングシステムに 依存する。Linux の場合は、以下の通りである。

新しく作成されたディレクトリの所有者はプロセスの実効ユーザ ID に設定される。 新たに作成されたディレクトリが含まれる親ディレクトリに set group ID ビットがセットされていたり、ファイルシステムが BSD の グループセマンティクス (mount -o bsdgroups あるいは、同じ意味の mount -o grpid) に従ってマウントされている場合には、 新たに作成されたディレクトリのグループ所有権は親ディレクトリの ものが継承される (親ディレクトリと同じになる)。 それ以外の場合は、グループ所有権はプロセスの実効グループ ID となる。

もし親ディレクトリに set group ID ビットがセットされていれば新しく作成される ディレクトリにも set group ID ビットがセットされる。

mkdirat()

mkdirat() システムコールは mkdir() と全く同様に動作するが、以下で説明する点が異なる。

pathname で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター dirfd が参照するディレクトリに対する相対パスと解釈される (mkdir() に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。

pathname で指定されたパス名が相対パスで、 dirfd が特別な値 AT_FDCWD の場合、 (mkdir() と同様に) pathname は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。

pathname で指定されたパス名が絶対パスの場合、 dirfd は無視される。

mkdirat() の必要性についての説明については openat(2) を参照。

返り値

mkdir() と mkdirat() は成功した場合 0 を、失敗した場合 -1 を返す (また、 errno がエラーの内容にしたがって適切に設定される)。

エラー

EACCES
プロセスが親ディレクトリへの書き込み許可を持たない、もしくは pathname 中のディレクトリのどれかに検索許可属性が無い (path_resolution(7) も参照)。
EDQUOT
ディスクブロックか inode がそのファイルシステムのユーザクォータに達していた。
EEXIST
pathname が既に存在している(ただしそれがディレクトリであるとは限らない)。 pathname がシンボリックリンクの場合も (その指定先が存在するかどうかに関らず)エラーになる。
EFAULT
pathname がアクセス可能なアドレス空間の外を指している。
ELOOP
pathname を解決するときに、解決すべきシンボリックリンクが多すぎた。
EMLINK
親ディレクトリへのリンク数が LINK_MAX を超えてしまう。
ENAMETOOLONG
pathname が長すぎる。
ENOENT
pathname の構成要素のディレクトリのいずれかが存在しないか、 またはリンク先が存在しないシンボリックリンクである。
ENOMEM
カーネルに十分なメモリがない。
ENOSPC
pathname を含むデバイスに新たにディレクトリを作成する空きが無い。
ENOSPC
もしくはユーザーのディスク quota が使い切られているため、 新たにディレクトリを作成することができない。
ENOTDIR
pathname のディレクトリ部分が実際にはディレクトリでない。
EPERM
pathname を含むファイルシステムがディレクトリの作成をサポートしていない。
EROFS
pathname が読み出し専用ファイルシステム上のファイルを指している。

mkdirat() では以下のエラーも発生する。

EBADF
dirfd が適切なファイルディスクリプタでない。
ENOTDIR
pathname が相対パスで、 dirfd がディレクトリ以外のファイルを参照しているファイルディスクリプタである。

バージョン

mkdirat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 で glibc に追加された。

準拠

mkdir(): SVr4, BSD, POSIX.1-2001, POSIX.1-2008.

mkdirat(): POSIX.1-2008.

注意

Linux では、許可ビット以外で意味を持つのは、 S_ISVTX モードビットだけである。 つまり、Linux では作成されたディレクトリは実際には (mode & ~umask & 01777) のモードを持つことになる。 stat(2) を参照のこと。

NFS を実現しているプロトコルには多くの不備が存在し、 それら中には mkdir() に影響を与えるものもある。

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。