OPEN(2)

名前
open, creat - ファイルまたはデバイスのオープン、作成を行なう。

書式
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int creat(const char *pathname, mode_t mode);

説明
open はファイルのオープン(open)の試み、ファイル・ディスクリプター( read, write, などで使用する小さな非負の整数)を返す。 flags は O_RDONLY, O_WRONLY, O_RDWR のどれか一つで、それぞれ読み込み専用、書き込み専用、読み書き用を要求する。 flags はさらに以下の一つ以上のビットOR(bitwise-or)でもよい。

O_CREAT
    ファイルが存在しなかった場合は作成(create)する。

O_EXCL
    O_CREAT と一緒に使用された場合、 ファイルが既に存在した場合はエラーになり、 open は失敗する。 O_EXCL は NFS ファイル・システムでは機能しない、 ロック(lock)機能などに使用した場合には競合状態になるだろう。 ロックファイルを使用した分解不能(atomic)のロック機能の解決には 同じファイル・システムに他と重ならないファイル(例えばホスト名と pid の 組み合わせ)を作成し、 link(2) を使用してロックファイルを作成し、そのファイルに stat(2) を使用してリンク数(link count)が 2 に上昇しているかをチェックする。 link() コールの返り値を使用してはいけない。

O_NOCTTY
    pathname は端末(terminal)デバイスを参照していて、 — tty(4) を参照すること — プロセスが制御端末を持たない場合は、それが制御端末になる。

O_TRUNC
    ファイルが既に存在する場合、それは切り詰め(truncate)られる。

O_APPEND
    ファイルを追加(append)モードでオープンする。最初と、それぞれの write の前にファイル・ポインターをファイルの最後に移動する。 NFS ファイル・システムでは、 O_APPEND で複数のプロセスが同じファイルに同時に 書き込もうとした場合は内容が破壊される。これは NFS が追加モードを サポートせず、クライアントのカーネル(kernel)がそれをシミュレート しているので、競合状態では使用できないためである。

O_NONBLOCK または O_NDELAY
    ファイルは非停止(non-blocking)モードでオープンされる。 open も他の全てのそのファイル・ディスクリプターに対する操作も 呼び出したプロセスを待たせることなく返される。

O_SYNC
    ファイルは同期(synchronous) I/O モードでオープンされる。 そのファイル・ディスクリプターに対する全ての write は対応するハードウェアに物理的に書き込まれるまでは呼び出した プロセスに戻らない。 以下の「制限」を見よ。

これらの選択フラグのいくつかはファイルをオープンした後でも fcntl を使用して変更することができる。 mode は新しいファイルを作成する場合に使用する許可(permission)を指定する。 それはプロセスの umask で通常通り修正され、作成されたファイルの許可は (mode & ~umask) となる。

mode のために以下のシンボル定数が提供されている :

S_IRWXU
    00700 ユーザー(ファイルの所有者) は読み込み、書き込み、 実行の許可を持つ。

S_IRUSR (S_IREAD)
    00400 ユーザーは読み込みの許可を持つ。

S_IWUSR (S_IWRITE)
    00200 ユーザーは書き込みの許可を持つ。

S_IXUSR (S_IEXEC)
    00100 ユーザーは実行の許可を持つ。

S_IRWXG
    00070 グループは読み込み、書き込み、実行の許可を持つ。

S_IRGRP
    00040 グループは読み込みの許可を持つ。

S_IWGRP
    00020 グループは書き込みの許可を持つ。

S_IXGRP
    00010 グループは実行の許可を持つ。

S_IRWXO
    00007 他人(others)は読み込み、書き込み、実行の許可を持つ。

S_IROTH
    00004 他人は読み込みの許可を持つ。

S_IWOTH
    00002 他人は書き込みの許可を持つ。

S_IXOTH
    00001 他人は実行の許可を持つ。

mode は flags に O_CREAT が指定されている場合は常に 指定する必要がある。それ以外の場合は無視される。 creat は flags に O_CREAT|O_WRONLY|O_TRUNC を指定して open を行なうのと等価である。

返り値
open と creat は新しいファイル・ディスクリプターを返す。 エラーが発生した場合は -1 を返す。(その場合は errno を適切に設定する)。 open で特殊ファイルをオープンすることはできるが、 creat で特殊ファイルを作成することはできないことに注意すること。- 代りに mknod(2) を使用する。

UIDマッピングを使用している NFS ファイル・システムでは、 open がファイル・ディスクリプターを返した場合でも read(2) が EACCES で拒否される場合がある。 これは open の許可のチェックはクライアントで行なわれているが、 読み込み、書き込みの際の UID マッピングはサーバーで行なわれているためである。

エラー

EEXIST
    pathname は既に存在し、 O_CREAT と O_EXCL が使用された。

EISDIR
    pathname はディレクトリを参照しており、書き込み要求が含まれていた。

ETXTBSY
    pathname が現在実行中の実行イメージを参照しており、書き込みを要求した。

EFAULT
    pathname がアクセス可能なアドレス空間の外部を差していた.

EACCES
    ファイルに対する要求されたアクセスが許されていないか、 pathname のディレクトリ部分のどれかに検索(実行)許可がなかった。

ENAMETOOLONG
    pathname が長過ぎる。

ENOENT
    pathname のディレクトリ部分が存在しないか壊れた(dangling)シンボリック・リンクである。

ENOTDIR
    pathname に含まれるディレクトリ部分のどれかが実際にはディレクトリでない。

EMFILE
    プロセスは既に可能な最大数のファイルをオープンしている。

ENFILE
    システム全体でオープン可能なファイルの限界に達っしている。

ENOMEM
    カーネルに十分なメモリが存在しない。

EROFS
    pathname が読み込み専用のファイルシステム上のファイルを参照しており、 書き込みアクセスを要求した。

ELOOP
    pathname を解決する際に遭遇したシンボリック・リンクが多過ぎる。

ENOSPC
    pathname を作成する必要があるが、 pathname を含んでいるデバイスに新しいファイルのための空き容量がない。

準拠
SVr4, SVID, POSIX, X/OPEN, BSD 4.3

制限
NFS を実現しているプロトコルには多くの不備があり、特に O_SYNC と O_NDELAY に影響する。

関連項目
read(2), write(2), fcntl(2), close(2), unlink(2), mknod(2), stat(2), umask(2), mount(2), socket(2), socket(2), fopen(3), link(2).