Provided by:
manpages-ja-dev_0.5.0.0.20070415-1_all 
前
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);
明
ファイルの pathname を与えると、 open()
はファイル・ディスクリプタを返す。
ファイル・ディスクリプタは、この後に続くシステムコール (read(2),
write(2), lseek(2), fcntl(2) など) で使用される小さな非負の整数である。
このシステムコールが成功した場合に返されるファイル・ディスクリプタは
そのプロセスがその時点でオープンしていないファイル・ディスクリプタの
うち最小の数字のものとなる。
新しいファイル・ディスクリプタは execve(2)
を実行した後もオープンされたままとなる (つまり、 fcntl(2) に説明がある
FD_CLOEXEC ファイル・ディスクリプタ・フラグは最初は無効である)。
ファイル・オフセット (file offset) はファイルの先頭に設定される
(lseek(2) 参照)。
open() を呼び出すと、「オープンファイル欺辧 (open file description)
が作成される。ファイル欺劼箸蓮▲轡好謄狒澗里
オープン中のファイルのテーブルのエントリである。
このエントリは、ファイル・オフセットとファイル状態フラグ (fcntl()
F_SETFL 操作により変更可能) が保持する。
ファイル・ディスクリプタはこれらのエントリの一つへの参照である。
この後で pathname
が削除されたり、他のファイルを参照するように変更されたりしても、
この参照は影響を受けない。 新しいオープンファイル-
述は最初は他のどのプロセスとも 共佑気譴討い覆い、 fork(2) で共-
が起こる場合がある。
パラメータ flags には O_RDONLY, O_WRONLY, O_RDWR
のどれかひとつが入っていなければならない。
これらはそれぞれ読み込み専用、書すみ専用、読み書ね僂
ファイルをオープンすることを要求するものである。
さらに、 flags には、ファイル作成フラグ (file creation flag)
とファイル状態フラグ (file status flag) を 0 個以上「ビット単位の OR
(bitwise-or)」で 指定することがでい襦 _ は O_CREAT,
O_EXCL, O_NOCTTY, and O_TRUNC である。 _
は以下のリストのうち上軌奮阿了弔蠅里發里任△襦
二種類のフラグの違いは、ファイル状態フラグの方は fcntl(2)
を使ってその内容を取得したり (場合によっては) 変更したりでい訶世砲△襦
ファイル作成フラグとファイル状態フラグの全リストを以下に示す:
O_APPEND
ファイルを追加 (append) モードでオープンする。 毎回の write()
の前に lseek()
を行ったかのように、ファイル・ポインターをファイルの最後に移動する。
NFS ファイル・システムで、 O_APPEND
を使用すると、複数のプロセスがひとつのファイルに同時にデータを追加した場合、
ファイルが壊れてしまうことがある。 これは NFS
が追加モードをサポートしていないため、 クライアントのカーネル
(kernel) がそれをシミュレートしなければならないのだが、
競合状態を避けることはでい覆いらである。
O_ASYNC
シグナル駆動 I/O (signal-driven I/O) を邑にする:
このファイル・ディスクリプタへの
入力または出力が可能になった場合に、シグナルを生成する
(デフォルトは SIGIO であるが、 fcntl(2)
によって変更可能である)。
この機能が使用可能なのは端末、疑似端末、ソケットのみであり、
(Linux 2.6 以降では) パイプと FIFO に対しても使用でい襦
さらに詳しい説明は fcntl(2) を参照すること。
O_CREAT
ファイルが存在しなかった場合は作成 (create) する。
ファイルの所夕 (ユーザー ID) は、プロセスの実効ユーザー ID
に設定される。 グループ所邑 (グループ ID)
は、プロセスの実効グループ ID または親ディレクトリのグループ ID
に設定される
(これは、ファイルシステムタイプ、マウントオプション、
親ディレクトリのモードに依存する。 例えば、 mount(8)
で説明されている ext2 ファイルシステムのマウントオプション bsd-
groups と sysvgroups を見よ)。
O_DIRECT
このファイルに対する I/O のゥ礇奪轡紊慮果を最小化しようとする。
このフラグを使うと、一般的に税修低下する。
しかしアプリケーションが独自にゥ礇奪轡鵐阿鮃圓辰討い襪茲Δ
特別な場合には役に立つ。 ファイルの I/O
はユーザー空間バッファに対して直接行われる。 I/O
は同期で行われる。 すなわち read(2) および write(2)
が完了した時点で、データの転送が完了したことが保証される。 Linux
2.4 では、転送サイズ、
ユーザーバッファのアラインメント、ファイルオフセットは、
ファイルシステムの論理ブロックサイズの倍数でなければならない。
Linux 2.6 では、512 バイトごとの-
界に配置されていれば充分である。
ブロックデバイスに対する似通った意味のインターフェースが raw(8)
で説明されている (但し、このインタフェースは非推奨である)。
O_DIRECTORY
pathname がディレクトリでなければオープンは失敗する。
このフラグは Linux 特佑任△蝓 opendir(3) が FIFO
やテープデバイスに対してコールされた場合の サービス不能 (denial-
of-service) 攻撃を避けるために カーネル 2.1.126 で追加された。
しかしこれは opendir の実装以外では使用するべい任呂覆ぁ
O_EXCL O_CREAT と一緒に使用された場合、
ファイルが既に存在した場合はエラーとなり、 open() は失敗する。
この場合、シンボリックリンクであっても存在するうちに入り、
それがどこを指しているかにはよらない。 O_EXCL は NFS
ファイル・システムでは機能しない、 このフラグでロック (lock)
機能を実現するプログラムは、 競合条件を含むだろう。
ロックファイルを使用した分解不能 (atomic) のロック機能の解決には
同じファイル・システムに他と名前の重ならないファイル
(例えばホスト名と pid の組み合わせ) を作成し、 link(2)
を使用してそのロックファイルへのリンクを作成する。 link()
コールの返り値が 0 ならばロックに成功している。
あるいは、そのファイルに stat(2) を使用してリンク数 (link count)
が 2 になっているかをチェックする。
そうなっていれば、同じくロックに成功しているということである。
O_LARGEFILE
(LFS) off_t ではサイズを表せない (だだし off64_t
ではサイズを表せる) ファイルをオープン可能にする。 この定義を-
効にするためには、 _LARGEFILE64_SOURCE
マクロを定義しなければならない。 32ビットシステムにおいて大-
なファイルにアクセスする方法を得たい場合、 (O_LARGEFILE
を使うよりも) _FILE_OFFSET_BITS
機能検査マクロをセットする方が望ましい方法である (fea-
ture_test_macros(7) を参照)。
O_NOATIME
(Linux 2.6.8 以降) ファイルに対して read(2) が実行されたと-
に、最終アクセス時刻 (inode の st_atime) を更新しない。
このフラグはインデックス作成やバックアッププログラムで使うことを意図している。
これを使うとディスクに対する操作を大幅に減らすことがでい襦
このフラグは全てのファイルシステムに対して-
効であるわけではない。 その一例が NFS
であり、サーバがアクセス時刻を管理している。
O_NOCTTY
pathname が端末 (terminal) デバイス -- tty(4) 参照 --
を指している場合に、たとえそのプロセスが制御端末を持っていなくても、
オープンしたファイルは制御端末にはならない。
O_NOFOLLOW
pathname がシンボリック・リンクだった場合、オープンは失敗する。
これは FreeBSD の拡張で、Linux には 2.1.126 より追加された。
pathname の前のコンポーネント (earlier component; 訳註:
最後のディレクトリセパレータより前の部分) が
シンボリック・リンクである場合には、それが指す先が参照される。
O_NONBLOCK または O_NDELAY
可能ならば、ファイルは非停止 (non-blocking)
モードでオープンされる。 open()
も、返したファイル・ディスクリプタに対する以後のすべての操作も
呼び出したプロセスを待たせることはない。 FIFO (ネームド・パイプ)
を扱う場合には fifo(7) も参照すること。 強制ファイルロック
(mandatory file lock) やファイルリース (file lease)
と組み合わせた場合の、 O_NONBLOCK の効果についての議論は、
fcntl(2) を参照すること。
O_SYNC ファイルは同期 (synchronous) I/O モードでオープンされる。 open()
が返したファイル・ディスクリプタに対して write()
を行うと、必ず呼び出したプロセスをブロックし、
該当ハードウェアに物理的に書すまれるまで返らない。
_
O_TRUNC
ファイルが既に存在し、通常ファイルであり、 書-
込み可モードでオープンされている (つまり、O_RDWR または O_WRONLY
の) 場合、 長さ 0 に切り詰め (truncate) られる。 ファイルが FIFO
または端末デバイスファイルの場合、 O_TRUNC フラグは無視される。
それ以外の場合、O_TRUNC の効果は未定義である。
これらの選択フラグのいくつかはファイルをオープンした後でも fcntl()
を使用して変更することがでい襦
引た mode は新しいファイルを作成する場合に使用するアクセス許可 (per-
mission) を指定する。 それはプロセスの umask
で通常通り修正され、作成されたファイルの許可は (mode & ~umask) となる。
このモードは新しく作成されたファイルの -
来のアクセスにのみ適用される点に注意すること。
読み取り専用のファイルを作成する open() コールであっても、 読み書-
可能なファイル・ディスクリプタを返すことがありうる。
mode のために以下のシンボル定数が提供されている :
S_IRWXU
00700 ユーザー (ファイルの所夕) に読み込み、書すみ、
実行の許可がある。
S_IRUSR
00400 ユーザーに読み込みの許可がある。
S_IWUSR
00200 ユーザーに書すみの許可がある。
S_IXUSR
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 他人に実行の許可がある。
flags に O_CREAT が指定されている場合は、 mode
を指定しなければならない。 それ以外の場合は無視される。
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
マッピングが行われるためである。
ファイルが新しく作成されると、 ファイルの st_atime, st_ctime, st_mtime
フィールド
(それぞれ最終アクセス時刻、最終状態変更時刻、最終修正時刻である。
stat(2) 参照) が現在時刻に設定される。 さらに親ディレクトリの st_ctime
と st_mtime も現在時刻に設定される。 それ以外の場合で、O_TRUNC
フラグでファイルが修正されたとい蓮 ファイルの st_ctime と st_mtime
フィールドが現在時刻に設定される。
ー
EACCES ファイルに対する要求されたアクセスが許されていないか、 pathname
のディレクトリ部分の何れかのディレクトリに検索許可がなかった。
またはファイルが存在せず、親ディレクトリへの書-
込み許可がなかった。 (path_resolution(2) も参照すること。)
EEXIST pathname は既に存在し、 O_CREAT と O_EXCL が使用された。
EFAULT pathname の指す領域がアクセス可能なアドレス空間にない。
EISDIR pathname はディレクトリを参照しており、書すみ要求が含まれていた
(つまり O_WRONLY または O_RDWR が設定されている)。
ELOOP pathname を解決する際に遭遇したシンボリック・リンクが多過ぎる。
または O_NOFOLLOW が指定されており、 pathname
がシンボリックリンクだった。
EMFILE プロセスがオープンしているファイル数がすでに最大数に達している。
ENAMETOOLONG
pathname が長過ぎる。
ENFILE オープンでい襯侫.ぅ襪旅膩弯瑤システム制限に達している。
ENODEV pathname
がデバイス・スペシャル・ファイルを参照しており、対応するデバイスが存在しない。
(これは Linux カーネルのバグであり、この場合には ENXIO
が返されるべい任△)
ENOENT O_CREAT が設定されておらず、かつ指定されたファイルが存在しない。
または、 pathname のディレクトリ部分が存在しないか壊れた (dan-
gling) シンボリック・リンクである。
ENOMEM カーネルに利用でい襯瓮皀蠅不造靴討い
ENOSPC pathname を作成する必要があるが、 pathname
を含んでいるデバイスに新しいファイルのための空ね椴未ない。
ENOTDIR
pathname
に含まれるディレクトリ部分のどれかが実際にはディレクトリでない。
または O_DIRECTORY が指定されており、 pathname
がディレクトリでない。
ENXIO O_NONBLOCK | O_WRONLY が設定されており、指定したファイルが FIFO
で
そのファイルを読み込みのためにオープンしているプロセスが存在しない。
または、ファイルがデバイス・スペシャル・ファイルで
対応するデバイスが存在しない。
EOVERFLOW
大い垢てオープンでい覆つ名錣離侫.ぅ襪鮖仮箸靴; 上気 O_LARGE-
FILE を参照。
EPERM O_NOATIME フラグが指定されたが、呼び出し元の実効ユーザー ID が
ファイルの所夕圓醗戝廚擦此△つ呼び出し元に特権 (CAP_FOWNER)
がない。
EROFS pathname
が読み込み専用のファイルシステム上のファイルを参照しており、
書すみアクセスが要求された。
ETXTBSY
pathname が現在実行中の実行イメージを参照しており、書-
込みが要求された。
EWOULDBLOCK
O_NONBLOCK
フラグが指定されたが、そのファイルには矛盾するリースが設定されていた
(fcntl(2) 参照)。
意
Linux では、O_NONBLOCK フラグは、 open を実行したいが read または write
を実行する意図は 必ずしもないことを意味する。 これは ioctl(2)
のためのファイルディスクリプタを取得するために、
デバイスをオープンするとい砲茲用いられる。
拠
SVr4, 4.3BSD, POSIX.1-2001. O_NOATIME, O_NOFOLLOW, O_DIRECTORY
フラグは Linux 特佑里發里任△襦 これらのフラグの定義を使うためには、
_GNU_SOURCE マクロを定義する必要があるかもしれない。
O_RDONLY | O_TRUNC の影響は未定義であり、その動作は実装によって異なる。
多くのシステムではファイルは実際に切り詰められる。
O_DIRECT フラグは SGI IRIX で導入され、 (ユーザーバッファの)
アラインメントの制限は Linux 2.4 と同じである。 IRIX
には適切な配置とサイズを取得するための fcntl(2) コールがある。 FreeBSD
4.x もこのフラグを導入したが、アラインメントに制限はない。 このフラグが
Linux でサポートされたのは、 カーネルバージョン 2.4.10 である。 古い
Linux カーネルは、このフラグを単に無視する。 このフラグの定義を-
効にするには _GNU_SOURCE を定義しておく必要があるかもしれない。
グ
「O_DIRECT でいつも困るのは、インタフェース全部が本当にお馬鹿な点だ。
たぶん危ないマインドコントロール剤で
頭がおかしくなったサルが設計したんじゃないかな」 -- Linus
現在のところ、 open() の呼び出し時に O_ASYNC を指定してシグナル駆動 I/O
を邑にすることはでい覆ぁ このフラグを邑にするには fcntl(2)
を使用すること。
NFS を実現しているプロトコルには多くの不備があり、特に O_SYNC と O_NDE-
LAY に影響する。
POSIX では、フラグ O_SYNC, O_DSYNC, O_RSYNC に対応する 3 種類の同期 I/O
を提供している。 Linux では、今のところ (カーネル 2.1.130)
これらは同じものである。
close(2), dup(2), fcntl(2), link(2), lseek(2), mknod(2), mount(2),
mmap(2), openat(2), path_resolution(2), read(2), socket(2), stat(2),
umask(2), unlink(2), write(2), fopen(3), fifo(7), fea-
ture_test_macros(7)