mknod() - ディレクトリー/ファイルの作成

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3
z/OS®UNIX

両方  

形式

_OPEN_SYS
#define _OPEN_SYS
#include <sys/stat.h>

int mknod(const char *path, mode_t mode, rdev_t dev_identifier);
_XOPEN_SOURCE_EXTENDED 1
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/stat.h>

int mknod(const char *path, mode_t mode, dev_t dev_identifier);

機能説明

path 引数で指定したパス名を使って、新しい ディレクトリー、正規ファイル、文字特殊ファイル、または FIFO 特殊ファイル (名前付きパイプ) を作成します。

mode 引数の先頭バイトは、ファイルの ファイル・タイプを以下のとおり決定します。
S_IFCHR
文字特殊ファイル。
S_IFFIFO
FIFO 特殊ファイル。
S_IFREG
通常ファイル。
S_IFDIR
ディレクトリー・ファイル。

新規ファイルのファイル許可ビットは、mode の 残りのビットで初期化され、プロセスのファイル作成マスク で変更されます。これらのシンボルについての詳細は、chmod() - ファイルまたはディレクトリーのモードの変更を参照してください。

dev_identifier は、文字特殊ファイル にだけ適用されます。これは、その他のファイル・タイプでは無視されます。dev_identifier には、装置メジャー番号と 装置マイナー番号を表す値が含まれます。メジャー番号は高位の 16 ビットに含まれていて、対話式端末などの装置クラスをサポートする 装置ドライバーを示します。マイナー番号は dev_identifier の 下位 16 ビットに含まれています。装置メジャー番号が 示すクラスの中にある特定装置を示します。z/OSUNIX サービスを使用する場合、装置メジャー番号は 次のようになります。
1
マスター疑似端末
2
スレーブ疑似端末
3
/dev/tty
4
/dev/null
5
/dev/fdn
6
ソケット
7
OCSRTY
8
OCSADMIN
9
"/dev/console"

装置メジャー番号 1、2、7: 装置マイナー番号の範囲は、システムで定義された 疑似端末の対の最大数よりも 1 だけ少ない数と 0 の間です。

装置メジャー番号 3、4、6、8、9: 装置マイナー番号は無視されます。

装置メジャー番号 5: 装置マイナー番号の値は、参照されるファイル記述子 を表します。例えば、装置マイナーの 0 はファイル記述子 の 0 を参照します。

mknod() は、正常に完了すると、st_atimest_ctime、および st_mtime というファイル のフィールドに更新のマークを付けます。また、新規ファイルを含む ディレクトリーの st_ctime フィールドおよび st_mtime フィールドにも更新のマークが付きます。

戻り値

正常に実行された場合、mknod() は 0 を戻します。

正常に実行されなかった場合、mknod() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
path のコンポーネントに関して検索許可が拒否され ています。あるいは、作成されるファイルの親ディレクトリー に関して書き込み許可が拒否されています。
EEXIST
その名前のファイルが既に存在します。
ELOOP
ループがシンボリック・リンクに存在しています。path の解決 で POSIX_SYMLOOP (limits.h ヘッダー・ファイルで 定義) を超えるシンボリック・リンクが検出されると、このエラーが 発行されます。
EMLINK
親ディレクトリーのリンク数が、システムに定義された最大値に達しています。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathnamePATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代わりに使われるパス名のストリングの長さが PATH_MAX を超えています。PATH_MAXNAME_MAX の値は、pathconf() を使用して確認できます。
ENOENT
path のコンポーネントが検出されませんでした。あるいは、path が指定されていません。
ENOSPC
ファイル・システムに新規ディレクトリーを含むための十分なスペースがありません。あるいは、親ディレクトリーを拡張できません。
ENOTDIR
path のコンポーネントがディレクトリーではありません。
EPERM
XPG4.2 での追加: 起動プロセスに、適切な特権がない。また、ファイル・タイプが FIFO 特殊ファイル・タイプではありません。
EROFS
読み取り専用ファイル・システム上に常駐することに なるため、path というファイルを 作成することができません。

CELEBM18
⁄* CELEBM18 *⁄                                   
#include <sys⁄stat.h>                                                           
#include <unistd.h>                                                             
#include <stdio.h>                                                              
                                                                                
#define master 0x00010000                                                       
                                                                                
main() {                                                                        
  char fn[]="char   ec";                                                        
                                                                                
  if (mknod(fn, S_IFCHR|S_IRUSR|S_IWUSR, master|0x0001) != 0)                   
    perror("mknod() error");                                                    
  else if (unlink(fn) != 0)                                                     
    perror("unlink() error");                                                   
}                                                                               

関連情報