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);
mknod():
システムコール mknod() は pathname という名前のファイルシステムノード (ファイル、デバイススペシャルファイル、名前付きパイプ) を、 属性 mode と dev の指定にしたがって作成する。
The mode argument specifies both the file mode to use and the type of node to be created. It should be a combination (using bitwise OR) of one of the file types listed below and zero or more of the file mode bits listed in inode(7).
The file mode is modified by the process's umask in the usual way: in the absence of a default ACL, the permissions of the created node are (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() に影響を与える。
mknod(1), chmod(2), chown(2), fcntl(2), mkdir(2), mount(2), socket(2), stat(2), umask(2), unlink(2), makedev(3), mkfifo(3), acl(5), path_resolution(7)
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。
2020-08-13 | Linux |