OPEN(2) | FreeBSD System Calls Manual | OPEN(2) |
名称
open, openat — 読み込み、書み込みまたは実行のためにファイルをオープンするか、または作成するライブラリ
Standard C Library (libc, -lc)書式
#include < fcntl.h> int
open( const char *path, int flags, ...);
int
openat( int fd, const char *path, int flags, ...);
解説
path によって指定されるファイル名は、引数 flags によって指定されたように実行、または、読み込みまたは書み込み (またはその両方) のためのオープンし、そのファイル記述子を呼び出し元プロセスに返します。ファイルが存在しない場合には、ファイルを作成するように、 flags 引数で指示できます ( O_CREAT フラグを指定する)。この場合、 open() と openat() は、追加引数 mode_t mode が必要であり、ファイルは、 chmod(2) で説明されているようにモード mode で作成され、プロセスの umask 値によって修正されます ( umask(2) を参照)。openat() 関数は、 path が相対パスを指定する場合を除いて、 open() 関数と同等です。この場合、オープンされるファイルは、カレントワーキングディレクトリの代わりにファイル記述子 fd に関連しているディレクトリに相対的に決定されます。 flag パラメータとオプションの 4 番目のパラメータは、ちょうど open() のパラメータに対応しています。 openat() が、 fd パラメータの特別な値 AT_FDCWD を渡されるなら、カレントワーキングディレクトリが、使用され、振る舞いは、 open() への呼び出しと同じです。
指定されるフラグは、論理和 ( OR) されている次の値によって形成されます:
O_RDONLY 読み込み専用でオープン O_WRONLY 書み込み専用でオープン O_RDWR 読み込みと書み込み用にオープン O_EXEC 実行専用でオープン O_NONBLOCK オープンするときにブロックしない O_APPEND 書み込みのたびに末尾に追加する O_CREAT ファイルが存在しない場合、作成する O_TRUNC サイズを 0 に切り詰める O_EXCL 作成するファイルが既に存在した場合、エラーとする O_SHLOCK 共有ロックを不可分に取得する O_EXLOCK 排他的ロックを不可分に取得する O_DIRECT キャッシュの効果を無くすまたは減らす O_FSYNC 同期的に書き込む O_SYNC 同期的に書き込む O_NOFOLLOW シンボリックリンクを辿らない O_NOCTTY 制御端末を割り当てない O_TTY_INIT デフォルトの端末属性を復旧します O_DIRECTORY ファイルがディレクトリでなければ、エラーとする O_CLOEXEC オープン時に FD_CLOEXEC を設定する
O_APPEND を設定してファイルをオープンすると、ファイルへの書み込みは、すべてファイルの末尾に追加されます。 O_TRUNC が指定されていてファイルが存在する場合、ファイルは、長さ 0 に切り捨てられます。 O_EXCL が O_CREAT とともに設定されていてファイルが既に存在する場合、 open() は、エラーを返します。これを使用して、簡単な排他的アクセスロッキングメカニズムを実現できます。 O_EXCL が設定されていてパス名の最後の構成要素がシンボリックリンクの場合、たとえシンボリックリンクが存在しない名前を指していたとしても open() は、処理に失敗します。 O_NONBLOCK フラグが指定されていて open() システムコールの結果、プロセスが何らかの理由でブロックされると (たとえば、ダイヤルアップ回線でキャリアを待っている場合)、 open() は、即座に戻ります。記述子は、その後の操作のために非ブロッキングモードのままにされます。
O_FSYNC がマスクに使用された場合、すべての書み込みは、直ちにディスクに書き込まれ、カーネルは、書き込まれたデータをキャッシュせず、書き込むべきすべてのデータが完了するまでは、この記述子に対するすべての書み込みは、戻りません。
O_SYNC は、 POSIX によって必要とされる O_FSYNC と同義語です。
O_NOFOLLOW がマスクに使用された場合で open() に渡された対象ファイルがシンボリックリンクの場合、 open() は、失敗します。
ファイルをオープンするときに、 flock(2) を使ったロックを得るには、共有ロックについては、 O_SHLOCK、排他的ロックについては、 O_EXLOCK を設定します。 O_CREAT でファイルを作成する場合、ロック要求が失敗することはありません (ただし、下層にあるファイルシステムがロックをサポートしている場合に限ります)。
読み書きにおけるキャッシュの効果を最小化もしくは無くすために O_DIRECT を使用可能です。システムは、読み書きするデータのキャッシングを避けようとします。データのキャッシングが避けられない場合、データのキャッシュに対する影響を最小化します。注意せずに使用すると、本フラグは、劇的に性能を劣化させます。
O_NOCTTY は、tty デバイスをオープンするとき、OS が制御端末としてこのファイルを割り当てないことを保証するために使用されます。これは、 FreeBSD ではデフォルトですが、 POSIX の互換性のために存在しています。 open() システムコールは、 FreeBSD で制御端末に割り当てません。
O_TTY_INIT は、最初に TTY をオープンするとき、OS が端末属性を復旧することを確実にするために使用されます。これは、 FreeBSD ではデフォルトですが、 POSIX の互換性のために存在しています。 TTY に関して open() への初期の呼び出しは、常に FreeBSD でのデフォルトの端末属性を復旧します。
O_DIRECTORY は、結果のファイル記述子がディレクトリを参照することを保証するために使用されます。デバイスノードのように、 O_RDONLY でオープンするのが危険でもあるファイルを高い特権があるアプリケーションがオープンすることから防ぐために、このフラグを使用することができます。
O_CLOEXEC は、新しく返されたファイル記述子のために FD_CLOEXEC フラグを設定するために使用されます。
成功するなら、 open() は、ファイル記述子を示す負でない整数を返します。処理に失敗すると-1 を返します。ファイル内の現在の位置をマークするファイルポインタは、ファイルの先頭に設定されます。
スリープしている devfs(5) からのデバイスノードのオープンがシグナルによって割り込まれるなら、たとえ SA_RESTART フラグがシグナルのために設定されていても、その呼び出しは、常に EINTR で失敗します。スリープしている FIFO ( mkfifo(2) 参照) のオープンは、通常どおり再開されます。
新しいファイルが作成される場合、そのグループは、ファイルが含まれるディレクトリのグループに設定されます。
O_CLOEXEC フラグが指定されなかったなら、新しい記述子は、 execve(2) システムコールに渡ってオープンされたままとなるように設定されます。 close(2), fcntl(2) と O_CLOEXEC の説明を参照してください。
システムには、1 つのプロセスによって同時にオープンできるファイル記述子数に制限があります。 getdtablesize(2) システムコールは、現在のシステム制限を返します。
戻り値
成功すれば、 open() と openat() は、ファイル記述子と呼ばれる、負でない整数を返します。失敗すれば、-1 が返され、エラーを示すために errno が設定されます。エラー
指定のファイルは、次の場合を除いてオープンされます:- [ ENOTDIR]
- パスの構成要素中にディレクトリ以外のものが含まれています。
- [ ENAMETOOLONG]
- パス名の構成要素が 255 文字を越えているか、またはパス名全体が 1023 文字を越えています。
- [ ENOENT]
- 指定されたファイルが存在せず、 O_CREAT も設定されていません。
- [ ENOENT]
- 存在しなければならないパス名の構成要素が存在しません。
- [ EACCES]
- 指定されたパスには、検索が許可されていないディレクトリが含まれています。
- [ EACCES]
- 要求されたパーミッション (読み込みまたは書み込み用、または両方) が指定のフラグに拒否されています。
- [ EACCES]
- O_TRUNC が指定され、書き込みパーミッションが拒否されています。
- [ EACCES]
- O_CREAT が指定されていて、ファイルが存在せず、かつファイルを作成するディレクトリに書み込み許可がありません。
- [ EPERM]
- O_CREAT が指定され、ファイルが存在していなくて、作成されることになっているディレクトリには、不変のフラグが設定されています、詳細については、 chflags(2) マニュアルページを参照してください。
- [ EPERM]
- 指定されたファイルには、不変フラグが設定されて、ファイルは、変更されています。
- [ EPERM]
- 指定されたファイルには、追加専用フラグが設定され、ファイルは、変更され、 O_TRUNC が指定されるか、または O_APPEND が指定されていません。
- [ ELOOP]
- パス名を変換するときに遭遇されたシンボリックリンクが多すぎます。
- [ EISDIR]
- 指定のファイルがディレクトリであり、引数が変更されるように指定されています。
- [ EROFS]
- 指定されたファイルは、読み込み専用ファイルシステム上にあり、そのファイルを修正しようとしています。
- [ EROFS]
- O_CREAT が指定され、指定されたファイルが読み込み専用のファイルシステムにあります。
- [ EMFILE]
- プロセスは、すでにオープンできるファイル記述子に関する制限に達しています。
- [ ENFILE]
- システムファイルテーブルが満杯です。
- [ EMLINK]
- O_NOFOLLOW が指定され、対象がシンボリックリンクです。
- [ ENXIO]
- 指定のファイルは、キャラクタ型特殊ファイルまたはブロック型特殊ファイルであり、この特殊ファイルに結び付けられたデバイスは、存在していません。
- [ ENXIO]
- O_NONBLOCK が設定され、指定されたファイルは、FIFO で、 O_WRONLY が設定され、プロセスには、読み込みでオープンしているファイルがありません。
- [ EINTR]
- open() 操作がシグナルによって割り込みされました。
- [ EOPNOTSUPP]
- O_SHLOCK または O_EXLOCK が指定されましたが、下層となっているファイルシステムは、ロックをサポートしていません。
- [ EOPNOTSUPP]
- 指定されたファイルは、スペシャルファイルであり、それにアクセスすることをサポートしていないファイルシステム (例えば NFS) を通してマウントされています。
- [ EWOULDBLOCK]
- O_NONBLOCK と、 O_SHLOCK か O_EXLOCK のどちらかが指定されましたが、ファイルは、ロックされています。
- [ ENOSPC]
- O_CREAT が指定されていて、ファイルが存在せず、新しいファイル用のエントリを配置中のディレクトリは、そのディレクトリを含むファイルシステムに空間が残っていないため拡張できません。
- [ ENOSPC]
- O_CREAT が指定されていて、ファイルが存在せず、かつファイルが作成中のファイルシステム上に未使用の inode がありません。
- [ EDQUOT]
- O_CREAT が指定されていて、ファイルが存在せず、かつ新しいファイル用のエントリを配置中のディレクトリは、そのディレクトリを含むファイルシステム上でディスクブロックのユーザのクォータが枯渇したために拡張できません。
- [ EDQUOT]
- O_CREAT が指定されていて、ファイルが存在せず、かつファイルを作成中のファイルシステム上で inode のユーザのクォータが枯渇しています。
- [ EIO]
- ディレクトリエントリを作成中、または O_CREAT 用の inode を割り当て中に入出力エラーが発生しました。
- [ ETXTBSY]
- ファイルは、純粋な手続き (共有テキスト) ファイルで、 open() システムコールが書み込みアクセスを要求しましたが、ファイルは、実行中です。
- [ EFAULT]
- path 引数は、プロセスに割り当てられたアドレス空間の範囲外を指しています。
- [ EEXIST]
- O_CREAT と O_EXCL が指定されていて、ファイルが存在します。
- [ EOPNOTSUPP]
- ソケットをオープンしようとしました (現時点では、実装されていません)。
- [ EINVAL]
- O_RDONLY, O_WRONLY, O_RDWR と O_EXEC の不正な組合わせで記述子をオープンしようとしました。
- [Eq EBADF]
- path 引数が、絶対パスを指定していません、そして fd 引数は、 AT_FDCWD でもなく検索のためにオープンされた有効なファイル記述子でもありません。
- [Eq ENOTDIR]
- path 引数が、絶対パスではありません、そして fd が、 AT_FDCWD でもなくディレクトリに関連しているファイル記述子でもありません。
- [Eq ENOTDIR]
- O_DIRECTORY が指定され、ファイルがディレクトリではありません。
関連項目
chmod(2), close(2), dup(2), fexecve(2), fhopen(2), getdtablesize(2), getfh(2), lgetfh(2), lseek(2), read(2), umask(2), write(2), fopen(3)歴史
open() 関数は、 Version 6 AT&T UNIX で登場しました。 openat() 関数は、 FreeBSD 8.0 で導入されました。バグ
The Open Group Extended API Set 2 仕様は、基本的なディレクトリが現在検索を可能にするかどうかではなく、検索のために fd がオープンされているかどうかに基づいている、 fd が検索可能であるかかどうのテストを要求します。 openat の現在の実装は、代わりにディレクトリの現在のパーミッションをチェックします。February 7, 2013 | FreeBSD |