open(2) FreeBSD 一般コマンドマニュアル

open

前のページ 上に戻る 次のページ

open




書式

     #include <fcntl.h>

     int
     open(const char *path, int flags, ...);


解説

     path によって指定されるファイルを、引数 flags によって指定されたように読
     取りまたは書込み (またはその両方) 用にオープンし、そのファイル記述子を呼
     び出し元プロセスに返します。ファイルが存在しない場合にはファイルを作成す
     るように、 flags 引数で指示できます (O_CREAT フラグを指定する)。この場
     合、 open には 3 番目の引数 mode_t mode が必要であり、ファイルは chmod(2)
     で説明されているようにモード mode で作成され、プロセスの umask 値によって
     修正されます (umask(2) を参照)。

     指定されたフラグは次の値の論理和 (or) で作成されます。

           O_RDONLY        読取り専用でオープン
           O_WRONLY        書込み専用でオープン
           O_RDWR          読取りと書込み用にオープン
           O_NONBLOCK      オープンするときにブロックしない
           O_APPEND        書込みのたびに末尾に追加する
           O_CREAT         ファイルが存在しない場合、作成する
           O_TRUNC         サイズを 0 に切り捨てる
           O_EXCL          作成するファイルが既に存在した場合、エラーとする
           O_SHLOCK        共有ロックを自動的に取得する
           O_EXLOCK        排他的ロックを自動的に取得する
           O_DIRECT        キャッシュの効果を無くすまたは減らす
           O_FSYNC         同期的に書き込む
           O_NOFOLLOW      シンボリックリンクを辿らない

     O_APPEND を設定してファイルをオープンすると、ファイルへの書込みはすべて
     ファイルの末尾に追加されます。 O_TRUNC が指定されていてファイルが存在する
     場合、ファイルは長さ 0 に切り捨てられます。 O_EXCL が O_CREAT とともに設
     定されていてファイルが既に存在する場合、 open() はエラーを返します。これ
     を使用して、簡単な排他的アクセスロッキングメカニズムを実現できます。
     O_EXCL が設定されていてパス名の最後の構成要素がシンボリックリンクの場合、
     たとえシンボリックリンクが存在しない名前を指していたとしても open() は処
     理に失敗します。 O_NONBLOCK フラグが指定されていて open() 呼び出しの結
     果、プロセスが何らかの理由でブロックされると (たとえば、ダイアルアップ回
     線でキャリアを待っている場合)、 open() は即座に戻ります。プロセスがオープ
     ンしたファイルに最初に入出力しようとしたとき、プロセスはブロックします (
     現時点では実装されていません)。

     O_FSYNC がマスクに使用された場合、すべての書き込みは直ちにディスクに書き
     込まれ、カーネルは書き込まれたデータをキャッシュせず、書き込むべきすべて
     のデータが完了するまではこの記述子に対するすべての書き込みは戻りません。

     O_NOFOLLOW がマスクに使用された場合で open() に渡された対象ファイルがシン
     ボリックリンクの場合、 open() は失敗します。

     ファイルポインタはファイルの先頭に設定されます。

     新しいファイルが作成される場合、そのグループはファイルが含まれるディレク
     トリのグループに設定されます。

     新しい記述子は execve(2) システムコールを通じてオープンされたままであるよ
     うに設定されます。 close(2)fcntl(2) を参照してください。

     システムには、1 つのプロセスによって同時にオープンできるファイル記述子数
     に制限があります。 getdtablesize(2) は現在のシステム制限を返します。


実装に関する注

     非スレッドライブラリでは、 open() は open システムコールとして実装されて
     います。

     スレッドライブラリでは、 open システムコールは _thread_sys_open() にアセ
     ンブルされ、 open() は、スレッドの再スケジュールを無効にし
     _thread_sys_open() を呼び出す関数として実装されています。戻る前に、
     open() はスレッドの再スケジュールを有効にします。


戻り値

     正常に完了すると、 open() はファイル記述子である負でない整数を返します。
     処理に失敗すると -1 が返され、エラーを示すために errno が設定されます。


エラー

     指定のファイルは次の場合を除いてオープンされます。

     [ENOTDIR]          パスの構成要素中にディレクトリ以外のものが含まれていま
                        す。

     [ENAMETOOLONG]     パス名の構成要素が 255 文字を越えているか、またはパス
                        名全体が 1023 文字を越えています。

     [ENOENT]           指定されたファイルが存在せず、 O_CREAT も設定されてい
                        ません。

     [ENOENT]           存在しなければならないパス名の構成要素が存在しません。

     [EACCES]           指定されたパスには、検索が許可されていないディレクトリ
                        が含まれています。

     [EACCES]           要求されたパーミッション (読取りまたは書込み用、または
                        両方) が指定のフラグに拒否されています。

     [EACCES]           O_CREAT が指定されていて、ファイルが存在せず、かつファ
                        イルを作成するディレクトリに書込み許可がありません。

     [ELOOP]            パス名を変換するときに検出されたシンボリックリンクが多
                        すぎます。

     [EISDIR]           指定のファイルがディレクトリであり、これを書込み用にオ
                        ープンするように引数が指定されています。

     [ENXIO]            指定されたファイルは FIFO パイプで、どのプロセスからも
                        読取り用にオープンされていないにも関らず、これを書込み
                        用にオープンしようとしました。

     [EINTR]            open() 操作がシグナルによって割り込みされました。

     [EOPNOTSUPP]       O_SHLOCK または O_EXLOCK が指定されましたが、下層と
                        なっているファイルシステムはロックをサポートしていませ
                        ん。

     [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 の不正な組合わせで記
                        述子をオープンしようとしました。


関連項目



ABELNET VPSサービス