openのヘルプ・マニュアル
日本語 英語
open --help
man open
OPEN(2) Linux Programmer’s Manual OPEN(2)
名前
open, creat - ファイルやデバイスのオープン、作成を行う
書式
#include
#include
#include
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
ファイル・ディスクリプタ・フラグは最初は無効である; 後述の Linux 固有の
フ ラグ O_CLOEXEC を使うとこのデフォルトを変更することができる)。ファイ
ル・オフセット (file offset) はファイルの先頭に設定される (lseek(2) 参
照)。
open() を呼び出すと、「オープンファイル記述」 (open file description)
が作成される。ファイル記述とは、システム全体のオープン中のファイルの テ
ー ブルのエントリである。このエントリは、ファイル・オフセットとファイル
状態フラグ (fcntl(2) 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, O_TRUNC である。 ファイル状態フラグは以下のリストのうち上記以
外の残りのものである。二種類のフラグの違いは、ファイル状態フラグの方 は
fcntl(2) を使ってその内容を取得したり (場合によっては) 変更したりできる
点にある。ファイル作成フラグとファイル状態フラグの全リストを以下に示す:
O_APPEND
ファイルを追加 (append) モードでオープンする。毎回の write(2) の
前に lseek(2) を行ったかのように、ファイル・ポインターをファイル
の 最後に移動する。 NFS ファイル・システムで、 O_APPEND を使用す
ると、複数のプロセスがひとつのファイルに同時にデータを追加した場
合 、ファイルが壊れてしまうことがある。これは NFS が追加モードを
サポートしていないため、クライアントのカーネル (kernel) がそれを
シミュレートしなければならないのだが、競合状態を避けることはでき
ないからである。
O_ASYNC
シグナル駆動 I/O (signal-driven I/O) を有効にする: このファイ ル
・ディスクリプタへの入力または出力が可能になった場合に、シグナル
を生成する (デフォルトは SIGIO であるが、 fcntl(2) によって変 更
可 能である)。この機能が使用可能なのは端末、疑似端末、ソケットの
みであり、 (Linux 2.6 以降では) パイプと FIFO に対しても使用でき
る。さらに詳しい説明は fcntl(2) を参照すること。
O_CLOEXEC (Linux 2.6.23 以降)
新 しいファイル・ディスクリプタに対して close-on-exec フラグを有
効にする。このフラグを指定することで、プログラムは FD_CLOEXEC フ
ラグをセットするための fcntl(2) F_SETFD 操作を別途呼び出す必要が
なくなる。また、ある種のマルチスレッドのプログラムはこのフラグの
使用は不可欠である。なぜなら、個別に FD_CLOEXEC フラグを設定する
fcntl(2) F_SETFD 操作を呼び出したとしても、あるスレッドがファ イ
ル デ ィスクリプタをオープンするのと同時に別のスレッドが fork(2)
と execve(2) を実行するという競合条件を避けるのには十分ではな い
からである。
O_CREAT
ファイルが存在しなかった場合は作成 (create) する。ファイルの所有
者 (ユーザー ID) は、プロセスの実効ユーザー ID に設定される。 グ
ル ープ所有権 (グループ ID) は、プロセスの実効グループ ID または
親ディレクトリのグループ ID に設定される (これは、ファイルシステ
ムタイプ、マウントオプション、親ディレクトリのモードに依存する。
mount(8) で説明されているマウントオプション bsdgroups と sysv-
groups を参照)。
mode は新しいファイルを作成する場合に使用するアクセス許可 (per-
mission) を指定する。 flags に O_CREAT が指定されている 場 合 、
mode を指定しなければならない。 O_CREAT が指定されていない場合、
mode は無視される。有効なアクセス許可は、普段と同じようにプロ セ
ス の 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 他人に実行の許可がある。
O_DIRECT (Linux 2.4.10 以降)
こ のファイルに対する I/O のキャッシュの効果を最小化しようとする
。このフラグを使うと、一般的に性能が低下する。しかしアプリケーシ
ョンが独自にキャッシングを行っているような特別な場合には役に立つ
。ファイルの I/O はユーザー空間バッファに対して直接行わ れ る 。
I/O は同期で行われる。すなわち read(2) および write(2) が完了し
た時点で、データの転送が完了したことが保証される。「注意」の節 (
下記) の議論も参照。
ブ ロックデバイスに対する似通った意味のインターフェースが raw(8)
で説明されている (但し、このインタフェースは非推奨である)。
O_DIRECTORY
pathname がディレクトリでなければオープンは失敗する。このフラ グ
は Linux 特有であり、 opendir(3) が FIFO やテープデバイスに対し
てコールされた場合のサービス不能 (denial-of-service) 攻撃を避 け
る た めにカーネル 2.1.126 で追加された。しかしこれは opendir(3)
の実装以外では使用するべきではない。
O_EXCL この呼び出しでファイルが作成されることを保証する。このフラ グ が
O_CREAT と一緒に指定され、 pathname のファイルが既に存在した場合
、 open() は失敗する。 O_CREAT が指定されなかった場合 の O_EXCL
の動作は未定義である。
これら二つのフラグが指定された際、シンボリックリンクは辿られない
。 pathname がシンボリックリンクの場合、シンボリックリンクがどこ
を指しているかに関わらず open() は失敗する。
O_EXCL は、Linux 2.6 以降で NFSv3 以降を使っている NFS でのみサ
ポートされている。 NFS の O_EXCL サポートが提供されていない環 境
では、このフラグに頼ってロック処理を実行するプログラムは競合状態
(race condition) に出会う可能性がある。ロックファイルを使用し て
不 可分 (atomic) なファイルロックを実現し、 NFS が O_EXCL をサポ
ートしているかに依存しないようにしたい場合、移植性のある方法は、
同じファイルシステム上に他と名前の重ならないファイル (例えばホス
ト名と PID を組み合わせた名前) を作成し、 link(2) を使用してその
ロ ックファイルへのリンクを作成することである。 link(2) コールの
返り値が 0 ならばロックに成功している。あるいは、そのファイル に
stat(2) を使用してリンク数 (link count) が 2 になっているかをチ
ェックする。そうなっていれば、同じくロックに成功しているというこ
とである。
O_LARGEFILE
(LFS) off_t ではサイズを表せない (だだし off64_t ではサイズを表
せる) ファイルをオープン可能にする。この定義を有効にするためには
、 _LARGEFILE64_SOURCE マクロを定義しなければならない。 32ビット
システムにおいて大きなファイルにアクセスする方法を得たい場 合 、
(O_LARGEFILE を使うよりも) _FILE_OFFSET_BITS 機能検査マクロをセ
ットする方が望ましい方法である (feature_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(2) を行うと、必ず
呼び出したプロセスをブロックし、該当ハードウェアに物理的に書き込
まれるまで返らない。 以下の「注意」の章も参照。
O_TRUNC
ファイルが既に存在し、通常ファイルであり、書き込み可モードでオー
プンされている (つまり、 O_RDWRまたはO_WRONLY の) 場合、長 さ 0
に切り詰め (truncate) られる。ファイルが FIFO または端末デバイス
ファイルの場合、 O_TRUNC フラグは無視される。それ以外の 場 合 、
O_TRUNC の効果は未定義である。
こ れらの選択フラグのいくつかはファイルをオープンした後でも fcntl(2) を
使用して変更することができる。
creat() は flags に O_CREAT|O_WRONLY|O_TRUNC を指定して open() を行うの
と等価である。
返り値
open() と creat() は新しいファイル・ディスクリプタを返す。エラーが発生
した場合は -1 を返す (その場合は errno が適切に設定される)。
エラー
EACCES ファイルに対する要求されたアクセスが許されていないか、 pathname
のディレクトリ部分の何れかのディレクトリに検索許可がなかった。ま
たはファイルが存在せず、親ディレクトリへの書き込み許可がなかった
。 (path_resolution(7) も参照すること。)
EEXIST pathname は既に存在し、 O_CREAT と O_EXCL が使用された。
EFAULT pathname の指す領域がアクセス可能なアドレス空間にない。
EFBIG EOVERFLOW 参照。
EINTR 遅いデバイス (例えば FIFO、 fifo(7) 参照) のオープンが完了するの
を待って停止している間にシステムコールがシグナルハンドラにより割
り込まれた。 signal(7) 参照。
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
pathname が参照しているのが、大き過ぎてオープンできない通常のフ
ァイルである。通常、このエラーが発生するは、32 ビットプラット フ
ォーム上で -D_FILE_OFFSET_BITS=64 を指定せずにコンパイルされたア
プリケーションが、ファイルサイズが (2<31)-1 ビットを超えるファイ
ル を 開 こうとした場合である。上記の O_LARGEFILE も参照。これは
POSIX.1-2001 で規定されているエラーである。 2.6.24 より前のカ ー
ネルでは、Linux はこの場合にエラー EFBIG を返していた。
EPERM O_NOATIME フラグが指定されたが、呼び出し元の実効ユーザー ID がフ
ァイルの所有者と一致せず、かつ呼び出し元に特権 (CAP_FOWNER) がな
い。
EROFS pathname が読み込み専用のファイルシステム上のファイルを参照して
おり、書き込みアクセスが要求された。
ETXTBSY
pathname が現在実行中の実行イメージを参照しており、書き込みが 要
求された。
EWOULDBLOCK
O_NONBLOCK フラグが指定されたが、そのファイルには矛盾するリース
が設定されていた (fcntl(2) 参照)。
準拠
SVr4, 4.3BSD, POSIX.1-2001. フラグ O_DIRECTORY, O_NOATIME, O_NOFOLLOW
は Linux 特 有 の も の であり、これらのフラグの定義を得るためには、
_GNU_SOURCE を定義する必要があるかもしれない。
O_CLOEXEC フラグは POSIX.1-2001 では規定されていないが 、 POSIX.1-2008
で規定されている。
O_DIRECT は POSIX では規定されていない。 O_DIRECT の定義を得るには
_GNU_SOURCE を定義しなければならない。
注意
Linux では、 O_NONBLOCK フラグは、 open を実行したいが read ま た は
write を実行する意図は必ずしもないことを意味する。これは ioctl(2) のた
めのファイルディスクリプタを取得するために、デバイスをオープンすると き
によく用いられる。
「アクセスモード」の値 O_RDONLY, O_WRONLY, O_RDWR は、 flags に指定でき
る他の値と違い、個々のビットを指定するものではなく、これらの値は flags
の下位 2 ビットを定義する。 O_RDONLY, O_WRONLY, O_RDWR はそれぞれ 0, 1,
2 に定義されている。言い換えると、 O_RDONLY | O_WRONLY の組み合わせは論
理的に間違いであり、確かに O_RDWR と同じ意味ではない。 Linux では、特別
な、非標準なアクセスモードとして 3 (バイナリでは 11) が予約されて お り
flags に指定できる。このアクセスモードを指定すると、ファイルの読み出し/
書き込み許可をチェックし、読み出しにも書き込みにも使用できないディス ク
リプタを返す。この非標準のアクセスモードはいくつかの Linux ドライバで使
用されており、デバイス固有の ioctl(2) 操作にのみ使用されるディスクリ プ
タを返すために使われている。
O_RDONLY | O_TRUNC の影響は未定義であり、その動作は実装によって異なる。
多くのシステムではファイルは実際に切り詰められる。
NFS を実現しているプロトコルには多くの不備があり、特に O_SYNC と O_NDE-
LAY に影響する。
POSIX では、フラグ O_SYNC, O_DSYNC, O_RSYNC に対応する 3 種類の同期 I/O
を提供している。 Linux では、今のところ (カーネル 2.1.130) これらは同じ
ものである。
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 フ
ィールドが現在時刻に設定される。
O_DIRECT
O_DIRECT フラグを使用する場合、ユーザ空間バッファの長さやアドレス、 I/O
の ファイルオフセットに関してアラインメントの制限が課されることがある。
Linux では、アラインメントの制限はファイルシステムやカーネルのバージ ョ
ン によって異なり、全く制限が存在しない場合もある。しかしながら、現在の
ところ、指定されたファイルやファイルシステムに対してこうした制限があ る
か を見つけるための、アプリケーション向けのインタフェースでファイルシス
テム非依存のものは存在しない。いくつかのファイルシステムでは、制限を 確
認するための独自のインタフェースが提供されている。例えば、 xfsctl(3) の
XFS_IOC_DIOINFO 命令である。
Linux 2.4 では、転送サイズ、ユーザーバッファのアラインメント、ファイ ル
オ フセットは、ファイルシステムの論理ブロックサイズの倍数でなければなら
ない。 Linux 2.6 では、512 バイトごとの境界に配置されていれば充分である
。
O_DIRECT フラグは SGI IRIX で導入された。SGI IRIX にも Linux 2.4 と同
様の (ユーザーバッファの) アラインメントの制限がある。また、IRIX には適
切な配置とサイズを取得するための fcntl(2) コールがある。 FreeBSD 4.x も
同じ名前のフラグを導入したが、アラインメントの制限はない。
O_DIRECT が Linux でサポートされたのは、カーネルバージョン 2.4.10 で あ
る。古い Linux カーネルは、このフラグを単に無視する。 O_DIRECT フラグを
サポートしていないファイルシステムもあり、その場合は、 O_DIRECT を使 用
すると open() は EINVAL で失敗する。
ア プリケーションは、同じファイル、特に同じファイルの重複するバイト領域
に対して、 O_DIRECT と通常の I/O を混ぜて使うのは避けるべきである。ファ
イ ルシステムがこのような状況において一貫性の問題を正しく扱うことができ
る場合であっても、全体の I/O スループットはどちらか一方を使用するときと
比 べて低速になるであろう。同様に、アプリケーションは、同じファイルに対
して mmap(2) と直接 I/O (O_DIRECT) を混ぜて使うのも避けるべきである。
NFS で O_DIRECT を使った場合の動作はローカルのファイルシステムの場合 と
違 う 。 古 い カ ー ネルや、ある種の設定でコンパイルされたカーネルは、
O_DIRECT と NFS の組み合わせをサポートしていないかもしれない。 NFS プロ
ト コ ル自体はサーバにフラグを渡す機能は持っていないので、 O_DIRECT I/O
はクライアント上のページキャッシュをバイパスするだけになり、サ ー バ は
I/O をキャッシュしているかもしれない。クライアントは、 O_DIRECT の同期
機構を保持するため、サーバに対して I/O を同期して行うように依頼する。サ
ーバによっては、こうした状況下、特に I/O サイズが小さい場合に性能が大き
く劣化する。また、サーバによっては、I/O が安定したストレージにまで行 わ
れ たと、クライアントに対して嘘をつくものもある。これは、サーバの電源故
障が起こった際にデータの完全性が保たれない危険は少しあるが、性能面で の
不 利な条件を回避するために行われている。 Linux の NFS クライアントでは
O_DIRECT I/O でのアラインメントの制限はない。
まとめると、 O_DIRECT は、注意して使うべきであるが、強力なツールとな る
可 能性を持っている。アプリケーションは O_DIRECT をデフォルトでは無効に
なっている性能向上のためのオプションと考えておくのがよいであろう。
「O_DIRECT でいつも困るのは、インタフェース全部が本当にお馬鹿 な
点だ。たぶん危ないマインドコントロール剤で頭がおかしくなったサル
が設計したんじゃないかな」 — Linus
バグ
現在のところ、 open() の呼び出し時に O_ASYNC を指定してシグナル駆動 I/O
を 有効にすることはできない。このフラグを有効にするには fcntl(2) を使用
すること。
関連項目
chmod(2), chown(2), close(2), dup(2), fcntl(2), link(2), lseek(2),
mknod(2), mmap(2), mount(2), openat(2), read(2), socket(2), stat(2),
umask(2), unlink(2), write(2), fopen(3), feature_test_macros(7),
fifo(7), path_resolution(7), symlink(7)
Linux 2008-12-03 OPEN(2)
OPEN(2) Linux Programmer’s Manual OPEN(2)
NAME
open, creat - open and possibly create a file or device
SYNOPSIS
#include
#include
#include
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);
DESCRIPTION
Given a pathname for a file, open() returns a file descriptor, a small,
non-negative integer for use in subsequent system calls (read(2),
write(2), lseek(2), fcntl(2), etc.). The file descriptor returned by a
successful call will be the lowest-numbered file descriptor not cur-
rently open for the process.
By default, the new file descriptor is set to remain open across an
execve(2) (i.e., the FD_CLOEXEC file descriptor flag described in
fcntl(2) is initially disabled; the Linux-specific O_CLOEXEC flag,
described below, can be used to change this default). The file offset
is set to the beginning of the file (see lseek(2)).
A call to open() creates a new open file description, an entry in the
system-wide table of open files. This entry records the file offset
and the file status flags (modifiable via the fcntl(2) F_SETFL opera-
tion). A file descriptor is a reference to one of these entries; this
reference is unaffected if pathname is subsequently removed or modified
to refer to a different file. The new open file description is ini-
tially not shared with any other process, but sharing may arise via
fork(2).
The argument flags must include one of the following access modes:
O_RDONLY, O_WRONLY, or O_RDWR. These request opening the file read-
only, write-only, or read/write, respectively.
In addition, zero or more file creation flags and file status flags can
be bitwise-or’d in flags. The file creation flags are O_CREAT, O_EXCL,
O_NOCTTY, and O_TRUNC. The file status flags are all of the remaining
flags listed below. The distinction between these two groups of flags
is that the file status flags can be retrieved and (in some cases) mod-
ified using fcntl(2). The full list of file creation flags and file
status flags is as follows:
O_APPEND
The file is opened in append mode. Before each write(2), the
file offset is positioned at the end of the file, as if with
lseek(2). O_APPEND may lead to corrupted files on NFS file sys-
tems if more than one process appends data to a file at once.
This is because NFS does not support appending to a file, so the
client kernel has to simulate it, which can’t be done without a
race condition.
O_ASYNC
Enable signal-driven I/O: generate a signal (SIGIO by default,
but this can be changed via fcntl(2)) when input or output
becomes possible on this file descriptor. This feature is only
available for terminals, pseudo-terminals, sockets, and (since
Linux 2.6) pipes and FIFOs. See fcntl(2) for further details.
O_CLOEXEC (Since Linux 2.6.23)
Enable the close-on-exec flag for the new file descriptor.
Specifying this flag permits a program to avoid additional
fcntl(2) F_SETFD operations to set the FD_CLOEXEC flag. Addi-
tionally, use of this flag is essential in some multithreaded
programs since using a separate fcntl(2) F_SETFD operation to
set the FD_CLOEXEC flag does not suffice to avoid race condi-
tions where one thread opens a file descriptor at the same time
as another thread does a fork(2) plus execve(2).
O_CREAT
If the file does not exist it will be created. The owner (user
ID) of the file is set to the effective user ID of the process.
The group ownership (group ID) is set either to the effective
group ID of the process or to the group ID of the parent direc-
tory (depending on file system type and mount options, and the
mode of the parent directory, see the mount options bsdgroups
and sysvgroups described in mount(8)).
mode specifies the permissions to use in case a new file is cre-
ated. This argument must be supplied when O_CREAT is specified
in flags; if O_CREAT is not specified, then mode is ignored.
The effective permissions are modified by the process’s umask in
the usual way: The permissions of the created file are
(mode & ~umask). Note that this mode only applies to future
accesses of the newly created file; the open() call that creates
a read-only file may well return a read/write file descriptor.
The following symbolic constants are provided for mode:
S_IRWXU 00700 user (file owner) has read, write and execute
permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
O_DIRECT (Since Linux 2.4.10)
Try to minimize cache effects of the I/O to and from this file.
In general this will degrade performance, but it is useful in
special situations, such as when applications do their own
caching. File I/O is done directly to/from user space buffers.
The I/O is synchronous, that is, at the completion of a read(2)
or write(2), data is guaranteed to have been transferred. See
NOTES below for further discussion.
A semantically similar (but deprecated) interface for block
devices is described in raw(8).
O_DIRECTORY
If pathname is not a directory, cause the open to fail. This
flag is Linux-specific, and was added in kernel version 2.1.126,
to avoid denial-of-service problems if opendir(3) is called on a
FIFO or tape device, but should not be used outside of the
implementation of opendir(3).
O_EXCL Ensure that this call creates the file: if this flag is speci-
fied in conjunction with O_CREAT, and pathname already exists,
then open() will fail. The behavior of O_EXCL is undefined if
O_CREAT is not specified.
When these two flags are specified, symbolic links are not fol-
lowed: if pathname is a symbolic link, then open() fails regard-
less of where the symbolic link points to.
O_EXCL is only supported on NFS when using NFSv3 or later on
kernel 2.6 or later. In environments where NFS O_EXCL support
is not provided, programs that rely on it for performing locking
tasks will contain a race condition. Portable programs that
want to perform atomic file locking using a lockfile, and need
to avoid reliance on NFS support for O_EXCL, can create a unique
file on the same file system (e.g., incorporating hostname and
PID), and use link(2) to make a link to the lockfile. If
link(2) returns 0, the lock is successful. Otherwise, use
stat(2) on the unique file to check if its link count has
increased to 2, in which case the lock is also successful.
O_LARGEFILE
(LFS) Allow files whose sizes cannot be represented in an off_t
(but can be represented in an off64_t) to be opened. The
_LARGEFILE64_SOURCE macro must be defined in order to obtain
this definition. Setting the _FILE_OFFSET_BITS feature test
macro to 64 (rather than using O_LARGEFILE) is the preferred
method of obtaining method of accessing large files on 32-bit
systems (see feature_test_macros(7)).
O_NOATIME (Since Linux 2.6.8)
Do not update the file last access time (st_atime in the inode)
when the file is read(2). This flag is intended for use by
indexing or backup programs, where its use can significantly
reduce the amount of disk activity. This flag may not be effec-
tive on all file systems. One example is NFS, where the server
maintains the access time.
O_NOCTTY
If pathname refers to a terminal device — see tty(4) — it will
not become the process’s controlling terminal even if the pro-
cess does not have one.
O_NOFOLLOW
If pathname is a symbolic link, then the open fails. This is a
FreeBSD extension, which was added to Linux in version 2.1.126.
Symbolic links in earlier components of the pathname will still
be followed.
O_NONBLOCK or O_NDELAY
When possible, the file is opened in non-blocking mode. Neither
the open() nor any subsequent operations on the file descriptor
which is returned will cause the calling process to wait. For
the handling of FIFOs (named pipes), see also fifo(7). For a
discussion of the effect of O_NONBLOCK in conjunction with
mandatory file locks and with file leases, see fcntl(2).
O_SYNC The file is opened for synchronous I/O. Any write(2)s on the
resulting file descriptor will block the calling process until
the data has been physically written to the underlying hardware.
But see NOTES below.
O_TRUNC
If the file already exists and is a regular file and the open
mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be
truncated to length 0. If the file is a FIFO or terminal device
file, the O_TRUNC flag is ignored. Otherwise the effect of
O_TRUNC is unspecified.
Some of these optional flags can be altered using fcntl(2) after the
file has been opened.
creat() is equivalent to open() with flags equal to
O_CREAT|O_WRONLY|O_TRUNC.
RETURN VALUE
open() and creat() return the new file descriptor, or -1 if an error
occurred (in which case, errno is set appropriately).
ERRORS
EACCES The requested access to the file is not allowed, or search per-
mission is denied for one of the directories in the path prefix
of pathname, or the file did not exist yet and write access to
the parent directory is not allowed. (See also path_resolu-
tion(7).)
EEXIST pathname already exists and O_CREAT and O_EXCL were used.
EFAULT pathname points outside your accessible address space.
EFBIG See EOVERFLOW.
EINTR While blocked waiting to complete an open of a slow device
(e.g., a FIFO; see fifo(7)), the call was interrupted by a sig-
nal handler; see signal(7).
EISDIR pathname refers to a directory and the access requested involved
writing (that is, O_WRONLY or O_RDWR is set).
ELOOP Too many symbolic links were encountered in resolving pathname,
or O_NOFOLLOW was specified but pathname was a symbolic link.
EMFILE The process already has the maximum number of files open.
ENAMETOOLONG
pathname was too long.
ENFILE The system limit on the total number of open files has been
reached.
ENODEV pathname refers to a device special file and no corresponding
device exists. (This is a Linux kernel bug; in this situation
ENXIO must be returned.)
ENOENT O_CREAT is not set and the named file does not exist. Or, a
directory component in pathname does not exist or is a dangling
symbolic link.
ENOMEM Insufficient kernel memory was available.
ENOSPC pathname was to be created but the device containing pathname
has no room for the new file.
ENOTDIR
A component used as a directory in pathname is not, in fact, a
directory, or O_DIRECTORY was specified and pathname was not a
directory.
ENXIO O_NONBLOCK | O_WRONLY is set, the named file is a FIFO and no
process has the file open for reading. Or, the file is a device
special file and no corresponding device exists.
EOVERFLOW
pathname refers to a regular file that is too large to be
opened. The usual scenario here is that an application compiled
on a 32-bit platform without -D_FILE_OFFSET_BITS=64 tried to
open a file whose size exceeds (2<<31)-1 bits; see also O_LARGE-
FILE above. This is the error specified by POSIX.1-2001; in
kernels before 2.6.24, Linux gave the error EFBIG for this case.
EPERM The O_NOATIME flag was specified, but the effective user ID of
the caller did not match the owner of the file and the caller
was not privileged (CAP_FOWNER).
EROFS pathname refers to a file on a read-only file system and write
access was requested.
ETXTBSY
pathname refers to an executable image which is currently being
executed and write access was requested.
EWOULDBLOCK
The O_NONBLOCK flag was specified, and an incompatible lease was
held on the file (see fcntl(2)).
CONFORMING TO
SVr4, 4.3BSD, POSIX.1-2001. The O_DIRECTORY, O_NOATIME, and O_NOFOLLOW
flags are Linux-specific, and one may need to define _GNU_SOURCE to
obtain their definitions.
The O_CLOEXEC flag is not specified in POSIX.1-2001, but is specified
in POSIX.1-2008.
O_DIRECT is not specified in POSIX; one has to define _GNU_SOURCE to
get its definition.
NOTES
Under Linux, the O_NONBLOCK flag indicates that one wants to open but
does not necessarily have the intention to read or write. This is typ-
ically used to open devices in order to get a file descriptor for use
with ioctl(2).
Unlike the other values that can be specified in flags, the access mode
values O_RDONLY, O_WRONLY, and O_RDWR, do not specify individual bits.
Rather, they define the low order two bits of flags, and are defined
respectively as 0, 1, and 2. In other words, the combination O_RDONLY
| O_WRONLY is a logical error, and certainly does not have the same
meaning as O_RDWR. Linux reserves the special, non-standard access
mode 3 (binary 11) in flags to mean: check for read and write permis-
sion on the file and return a descriptor that can’t be used for reading
or writing. This non-standard access mode is used by some Linux
drivers to return a descriptor that is only to be used for device-spe-
cific ioctl(2) operations.
The (undefined) effect of O_RDONLY | O_TRUNC varies among implementa-
tions. On many systems the file is actually truncated.
There are many infelicities in the protocol underlying NFS, affecting
amongst others O_SYNC and O_NDELAY.
POSIX provides for three different variants of synchronized I/O, corre-
sponding to the flags O_SYNC, O_DSYNC and O_RSYNC. Currently (2.1.130)
these are all synonymous under Linux.
Note that open() can open device special files, but creat() cannot cre-
ate them; use mknod(2) instead.
On NFS file systems with UID mapping enabled, open() may return a file
descriptor but, for example, read(2) requests are denied with EACCES.
This is because the client performs open() by checking the permissions,
but UID mapping is performed by the server upon read and write
requests.
If the file is newly created, its st_atime, st_ctime, st_mtime fields
(respectively, time of last access, time of last status change, and
time of last modification; see stat(2)) are set to the current time,
and so are the st_ctime and st_mtime fields of the parent directory.
Otherwise, if the file is modified because of the O_TRUNC flag, its
st_ctime and st_mtime fields are set to the current time.
O_DIRECT
The O_DIRECT flag may impose alignment restrictions on the length and
address of userspace buffers and the file offset of I/Os. In Linux
alignment restrictions vary by file system and kernel version and might
be absent entirely. However there is currently no file system-indepen-
dent interface for an application to discover these restrictions for a
given file or file system. Some file systems provide their own inter-
faces for doing so, for example the XFS_IOC_DIOINFO operation in
xfsctl(3).
Under Linux 2.4, transfer sizes, and the alignment of the user buffer
and the file offset must all be multiples of the logical block size of
the file system. Under Linux 2.6, alignment to 512-byte boundaries
suffices.
O_DIRECT I/Os should never be run concurrently with the fork(2) system
call, if the memory buffer is a private mapping (i.e., any mapping cre-
ated with the mmap(2) MAP_PRIVATE flag; this includes memory allocated
on the heap and statically allocated buffers). Any such I/Os, whether
submitted via an asynchronous I/O interface or from another thread in
the process, should be completed before fork(2) is called. Failure to
do so can result in data corruption and undefined behavior in parent
and child processes. This restriction does not apply when the memory
buffer for the O_DIRECT I/Os was created using shmat(2) or mmap(2) with
the MAP_SHARED flag. Nor does this restriction apply when the memory
buffer has been advised as MADV_DONTFORK with madvise(2), ensuring that
it will not be available to the child after fork(2).
The O_DIRECT flag was introduced in SGI IRIX, where it has alignment
restrictions similar to those of Linux 2.4. IRIX has also a fcntl(2)
call to query appropriate alignments, and sizes. FreeBSD 4.x intro-
duced a flag of the same name, but without alignment restrictions.
O_DIRECT support was added under Linux in kernel version 2.4.10. Older
Linux kernels simply ignore this flag. Some file systems may not
implement the flag and open() will fail with EINVAL if it is used.
Applications should avoid mixing O_DIRECT and normal I/O to the same
file, and especially to overlapping byte regions in the same file.
Even when the file system correctly handles the coherency issues in
this situation, overall I/O throughput is likely to be slower than
using either mode alone. Likewise, applications should avoid mixing
mmap(2) of files with direct I/O to the same files.
The behaviour of O_DIRECT with NFS will differ from local file systems.
Older kernels, or kernels configured in certain ways, may not support
this combination. The NFS protocol does not support passing the flag
to the server, so O_DIRECT I/O will only bypass the page cache on the
client; the server may still cache the I/O. The client asks the server
to make the I/O synchronous to preserve the synchronous semantics of
O_DIRECT. Some servers will perform poorly under these circumstances,
especially if the I/O size is small. Some servers may also be config-
ured to lie to clients about the I/O having reached stable storage;
this will avoid the performance penalty at some risk to data integrity
in the event of server power failure. The Linux NFS client places no
alignment restrictions on O_DIRECT I/O.
In summary, O_DIRECT is a potentially powerful tool that should be used
with caution. It is recommended that applications treat use of
O_DIRECT as a performance option which is disabled by default.
"The thing that has always disturbed me about O_DIRECT is that
the whole interface is just stupid, and was probably designed by
a deranged monkey on some serious mind-controlling substances."
— Linus
BUGS
Currently, it is not possible to enable signal-driven I/O by specifying
O_ASYNC when calling open(); use fcntl(2) to enable this flag.
SEE ALSO
chmod(2), chown(2), close(2), dup(2), fcntl(2), link(2), lseek(2),
mknod(2), mmap(2), mount(2), openat(2), read(2), socket(2), stat(2),
umask(2), unlink(2), write(2), fopen(3), feature_test_macros(7),
fifo(7), path_resolution(7), symlink(7)
COLOPHON
This page is part of release 3.22 of the Linux man-pages project. A
description of the project, and information about reporting bugs, can
be found at http://www.kernel.org/doc/man-pages/.
Linux 2008-12-03 OPEN(2)