MKNOD(2) | Linux Programmer's Manual | MKNOD(2) |
mknod, mknodat - 特殊ファイルや通常のファイルを作成する
#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); #include <fcntl.h> /* AT_* 定数の定義 */ #include <sys/stat.h> int mknodat(int dirfd, const char *pathname, mode_t mode, dev_t dev);
glibc
向けの機能検査マクロの要件
(feature_test_macros(7) 参照):
mknod():
システムコール mknod() は pathname という名前のファイルシステムノード (ファイル、デバイススペシャルファイル、名前付きパイプ) を、 属性 mode と dev の指定にしたがって作成する。
mode 引き数には、作成するノードの許可属性 (permission) とタイプを指定する。 mode の指定は以下にあげるファイルタイプのうちの 1 つと、 許可属性の組合せ (ビットごとの OR を使用) で行う。
許可属性は通常通り、プロセスの umask によって修正され、作成されたノードの許可属性は (mode & ~umask) となる。
ファイルタイプには S_IFREG, S_IFCHR, S_IFBLK, S_IFIFO, S_IFSOCK のいずれかを指定しなければならない。 それぞれ順に、通常のファイル (空のファイルとして作成される)・ キャラクタースペシャルファイル・ブロックスペシャルファイル・ FIFO (名前付きパイプ)・UNIX ドメインソケットである (ファイルタイプ 0 は S_IFREG と同じである)。
ファイルタイプが S_IFCHR または S_IFBLK のとき、 dev には作成するデバイススペシャルファイルのメジャー番号と マイナー番号を指定する (makedev(3) は dev のこれらの番号を作成する際に役立つだろう)。 それ以外の場合は dev は無視される。
pathname が既に存在する場合、またはシンボリックリンクの場合、 この呼び出しは EEXIST エラーで失敗する。
新しく作成されたノードの所有者はプロセスの実効ユーザー ID にセットされる。 新たに作られたノードを保持する 親ディレクトリの set-group-ID ビットがセットされていたり、 ファイルシステムが BSD のグループセマンティクスにしたがって マウントされている場合には、新しいノードのグループ所有権は親ディレクトリの グループ所有権を継承する (親ディレクトリと同じになる)。 また、そうでなかった場合の所有グループはプロセスの実効グループ ID となる。
mknodat() システムコールは mknod() と全く同様に動作するが、以下で説明する点が異なる。
pathname で指定されたパス名が相対パスの場合、このパス名はファイルディスクリプター dirfd が参照するディレクトリに対する相対パスと解釈される (mknod() に相対パス名を渡した場合のように、呼び出したプロセスのカレントワーキングディレクトリに対する相対パスではない)。
pathname で指定されたパス名が相対パスで、 dirfd が特別な値 AT_FDCWD の場合、 (mknod() と同様に) pathname は呼び出したプロセスのカレントワーキングディレクトリに対する相対パスと解釈される。
pathname で指定されたパス名が絶対パスの場合、 dirfd は無視される。
mknodat() の必要性についての説明については openat(2) を参照。
mknod() と mknodat() は成功した場合 0 を、失敗した場合 -1 を返す (失敗した場合 errno がエラーの内容にしたがってセットされる)。
mknodat() では以下のエラーも発生する。
mknodat() はカーネル 2.6.16 で Linux に追加された。 ライブラリによるサポートはバージョン 2.4 で glibc に追加された。
mknod(): SVr4, 4.4BSD, POSIX.1-2001 (下記も参照), POSIX.1-2008.
mknodat(): POSIX.1-2008.
POSIX.1-2001 では次のように書いている: 「mknod() の唯一の移植性のある使用法は、FIFO スペシャルファイルを作成することである。 mode が S_IFIFO ではない場合、または dev が 0 ではない場合、 mknod() の挙動は規定されていない。」 しかしながら、現在ではこの目的のために mknod() を使用すべきではない。この目的のために特別に定義された関数である mkfifo() を使用すべきである。
Linux では、ディレクトリを作成するために mknod() を使用することはできない。 ディレクトリは mkdir(2) で作成すべきである。
NFS を実現しているプロトコルには多くの不備が存在し、 それらのいくつかは mknod() と mknodat() に影響を与える。
chmod(2), chown(2), fcntl(2), mkdir(2), mknodat(2), mount(2), socket(2), stat(2), umask(2), unlink(2), makedev(3), mkfifo(3), path_resolution(7)
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2014-02-21 | Linux |