MKDIR(2) | Linux Programmer's Manual | MKDIR(2) |
mkdir, mkdirat - ディレクトリを作成する
#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():
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() システムコールは mkdir() と全く同様に動作するが、以下で説明する点が異なる。
pathname で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター dirfd が参照するディレクトリに対する相対パスと解釈される (mkdir() に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
pathname で指定されたパス名が相対パスで、 dirfd が特別な値 AT_FDCWD の場合、 (mkdir() と同様に) pathname は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
pathname で指定されたパス名が絶対パスの場合、 dirfd は無視される。
mkdirat() の必要性についての説明については openat(2) を参照。
mkdir() と mkdirat() は成功した場合 0 を、失敗した場合 -1 を返す (また、 errno がエラーの内容にしたがって適切に設定される)。
mkdirat() では以下のエラーも発生する。
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() に影響を与えるものもある。
mkdirat() が利用できない古いカーネルでは、 glibc ラッパー関数は mkdir() を使用するモードにフォールバックする。 pathname が相対パスの場合、 glibc は dirfd 引き数に対応する /proc/self/fd のシンボリックリンクに基づいてパス名を構成する。
mkdir(1), chmod(2), chown(2), mknod(2), mount(2), rmdir(2), stat(2), umask(2), unlink(2), path_resolution(7)
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-08-19 | Linux |