OPEN(2) — NEWS-OS 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 が指定されていると、FIFO を読み取り用にオープンした時、その FIFO を 書き込み用にオープンしているプロセスがなくてもブロックしません。 FIFO を書き込み用にオープンした時、その FIFO を読み取り用にオープン しているプロセスがないと、エラーを返します。 端末回線をオープンした時、キャリアがあるまでブロックされますが、 O_NDELAY でブロックしないようようにする機能は、現在のところ実現されていません。
正常終了時には、 ファイルディスクリプタと呼ばれる負ではない整数が返されます。 ファイル内での現在の位置を マークするために使用されるファイルポインタは、 ファイルの先頭にセットされます。
新しいディスクリプタは、 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 4.2.1R