Provided by: manpages-ja-dev_0.5.0.0.20140515+dfsg-2_all bug

名前

       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():
           _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 500 ||
           _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

説明

       システムコール mknod()  は pathname という名前のファイルシステム・ノード (ファイル、デバイ
       ススペシャルファイル、名前付きパイプ) を、 属性 modedev の指定にしたがって作成する。

       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()
       mknodat() システムコールは mknod() と全く同様に動作するが、以下で説明する点が異なる。

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

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

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

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

返り値

       mknod() と mknodat() は成功した場合 0 を、失敗した場合 -1 を返す (失敗した場合 errno  がエ
       ラーの内容にしたがってセットされる)。

エラー

       EACCES プロセスが親ディレクトリへの書き込み許可を持たない。  もしくはパス名  pathname 中の
              ディレクトリ部分のどれかに検索許可属性が無い (path_resolution(7)  も参照すること)。

       EDQUOT ディスクブロックか inode がそのファイルシステムのユーザクォータに達していた。

       EEXIST pathname がすでに存在する。 これには pathname  がシンボリックリンクである場合も含ま
              れる (シンボリックリンクがリンク切れか (dangling) どうかは関係ない)。

       EFAULT pathname がそのプロセスのアクセス可能なアドレス空間の外を指している。

       EINVAL mode  が通常のファイル・デバイススペシャルファイル・FIFO・ソケット以外を 作成するよ
              うにセットされている。

       ELOOP  パス名 pathname を解決するときに、含まれているシンボリックリンクが多すぎた。

       ENAMETOOLONG
              pathname が長過ぎる。

       ENOENT pathname 中のディレクトリ部分が存在しない、  もしくはリンク先の無いシンボリックリン
              クである。

       ENOMEM 十分なカーネルメモリが無い。

       ENOSPC pathname のあるデバイスに新たにノードを作成する空きが無い。

       ENOTDIR
              pathname 中のディレクトリ要素が、実際にはディレクトリでない。

       EPERM  mode  は通常のファイル・FIFO (名前付きパイプ)・UNIX ドメインソケット以外を 作成する
              ようにセットされているが、実行者が特権   (Linux   では   CAP_MKNOD   ケーパビリティ
              (capability)) を持っていない。 または pathname を保持するファイルシステムが、指定さ
              れたノード形式をサポートしていない。

       EROFS  pathname が読み出し専用ファイルシステム上のファイルを指している。

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

       EBADF  dirfd が有効なファイルディスクリプタでない。

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

バージョン

       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 スペ
       シャルファイルを作成することである。  modeS_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.65 の一部 である。プロジェクト
       の説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。