OPEN(2) — UNIX Programmer’s Manual
名称
open − 読み取り/書き込みのためにファイルをオープンする または新しいファイルを 作成する
形式
#include <sys/file.h>
open(path, flags, mode)
char ∗path;
int flags, mode;
解説
open は、 flags 引数の指定に従って、 読み取りおよび/または書き込みのために、 ファイル path をオープンし、そのファイルのディスクリプタを返します。 flags 引数は、 そのファイルが存在していない場合には、 (O_CREAT フラグを指定することによって)ファイルの作成を指示することができます。 その場合、そのファイルは、 chmod(2) で述べられているようにモード mode を用いて作成され、 そのプロセスの umask 値によって修正されます (umask(2) 参照)。
path は、 パス名を 表す、 ナルキャラクタで終了するASCII文字列のアドレスです。 指定されるフラグは、 次の値の 論理和をとることによって作られます。
O_RDONLY読み取りのためだけにオープンする
O_WRONLY書き込みのためだけにオープンする
O_RDWR読み取りと書き込みのためにオープンする
O_NDELAYオープン時にブロックしない
O_APPEND各書き込みでアペンドする
O_CREATファイルが存在しない場合には、ファイルを作成する
O_TRUNCサイズを切り捨てて 0 にする
O_EXCLファイル作成時に既にそのファイルが存在すると、エラーを返す
O_APPEND を セットしてファイルを オープンすると、 そのファイルへの書き込みのたびに、 アペンドされます。 O_TRUNC が指定され、 ファイルが存在する場合には、 そのファイルは切り捨てられて長さ 0 になります。 O_CREAT と共に O_EXCL がセットされていると、 そのファイルが既に存在している場合には、OPEN はエラーを 返します。 これは、 排他的アクセスを ロックする簡単なメカニズムを 実現するために使用することができます。 O_EXCL がセットされていて、 パス名の最後の構成要素がシンボリックリンクである場合には、 そのシンボリックリンクが存在しない名前を 指していても、open は失敗します。 O_NDELAY フラグが指定されていて、 なんらかの理由(例えば、 ダイアルアップ回線でキャリアを 待つなど)で、 その open コールによってプロセスがブロックされるような場合には、 その open コールは即座にリターンします。 そのオープンファイルに対して、 プロセスが初めて入出力を 行おうとしたときには、 そのプロセスはブロックします(現在のところ、 実現されていません)。
正常終了時には、 ファイルディスクリプタと呼ばれる負ではない整数が返されます。 ファイル内での現在の位置を マークするために使用されるファイルポインタは、 ファイルの先頭にセットされます。
新しいディスクリプタは、 execve システムコールの実行後にもオープンされたまま残るようにセットされます (close(2) 参照)。
1つのプロセスによって同時にオープンされるファイルディスクリプタの数には、 システムによって制限が課せられています。 getdtablesize(2) は、 現在のシステムの制限値を 返します。
エラー
以下に示されているエラーのうち、1つ以上が真でない限り、 指定されたファイルはオープンされます。
[ENOTDIR] パスプレフィックスの構成要素がディレクトリではないものがある。
[EINVAL] パス名に最上位ビットのセットされたキャラクタが含まれている。 (NEWS-OSではおきない。)
[ENAMETOOLONG]
パス名の 1構成要素が 255 バイトを 超えている、 またはパス名全体が 1023 バイトを 超えている。
[ENOENT] O_CREATがセットされてなく、 かつ、 指定されたファイルが存在していない。
[ENOENT] 存在していなければならないパス名の構成要素が存在していないものがある。
[EACCES] パスプレフィックスの構成要素についてサーチパーミッションが 否定されているものがある。
[EACCES] (読み取りおよび/または書き込みのために)必要なパーミッションが、 指定されたフラグについて否定されている。
[EACCES] O_CREAT が指定され、 ファイルが存在していない場合に、 ファイルが作成されるディレクトリが書き込みを 許していない。
[ELOOP] パス名の処理で遭遇したシンボリックリンクの数が多すぎる。
[EISDIR] 指定されたファイルはディレクトリであり、 引数は、 それが書き込みのためにオープンされることを 指定している。
[EROFS] 指定されたファイルが読み取り専用のファイルシステム上にあり、 そのファイルが修正されようとしている。
[EMFILE] 1プロセス当りのオープンファイルディスクリプタの数に関する システムの制限に既に到達している。
[ENFILE] システムファイルテーブルがいっぱいである。
[ENXIO] 指定されたファイルがキャラクタ型またはブロック型特殊ファイルであり、 その特殊ファイルに関するデバイスが存在していない。
[ENOSPC] O_CREATが指定されていて、 ファイルが存在していない場合に、 新しいファイルのエントリを 入れるディレクトリのあるファイルシステムにスペースが残されていないために、 そのディレクトリを 拡張することができない。
[ENOSPC] O_CREAT が指定されていて、 ファイルが存在していない場合に、 そのファイルが作成されるファイルシステムに、 空いているiノードがない。
[EDQUOT] O_CREAT が指定されていて、 ファイルが存在していない場合に、 その新しいファイルのエントリを 入れるディレクトリのあるファイルシステムで、 そのユーザのディスクブロックの割り当て量が使い果たされているために、 そのディレクトリを 拡張することができない。
[EDQUOT] O_CREAT が指定されていて、 ファイルが存在していない場合に、 そのファイルが作成されるファイルシステムで、 そのユーザのiノードの割り当て量が使い果たされている。
[EIO] O_CREAT でディレクトリエントリを 作成している間、 またはiノードを 割り当てている間に、 入出力エラーが発生した。
[ETXTBSY] そのファイルは、 実行中の純プロシージャ(共用テキスト)ファイルであり、 openコールが書き込みアクセスを 要求している。
[EFAULT] path が、 そのプロセスの割り当てアドレススペースの外を 指している。
[EEXIST] O_CREAT と O_EXCL が指定されていて、 ファイルが存在している。
[EOPNOTSUPP]
ソケットを オープンしようとした(現在のところ、 実現されていない)。
関連事項
chmod(2), close(2), dup(2), getdtablesize(2), lseek(2), read(2), write(2), umask(2)
NEWS-OSRelease 3.3