.\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)open.2 8.2 (Berkeley) 11/16/93 .\" %FreeBSD: src/lib/libc/sys/open.2,v 1.11.2.8 2001/08/17 15:42:45 ru Exp % .\" .\" $FreeBSD: doc/ja_JP.eucJP/man/man2/open.2,v 1.9 2001/07/29 05:15:14 horikawa Exp $ .Dd November 16, 1993 .Dt OPEN 2 .Os .Sh 名称 .Nm open .Nd 読取りまたは書込み用にファイルをオープンする、または作成する .Sh ライブラリ .Lb libc .Sh 書式 .Fd #include .Ft int .Fn open "const char *path" "int flags" "..." .Sh 解説 .Fa path によって指定されるファイルを、引数 .Fa flags によって指定されたように読取りまたは書込み (またはその両方) 用にオープンし、 そのファイル記述子を呼び出し元プロセスに返します。 ファイルが存在しない場合にはファイルを 作成するように、 .Fa flags 引数で指示できます .Dv ( O_CREAT フラグを指定する)。 この場合、 .Nm には 3 番目の引数 .Fa "mode_t mode" が必要であり、ファイルは .Xr chmod 2 で説明されているようにモード .Fa mode で作成され、プロセスの umask 値によって修正されます .Pf ( Xr umask 2 を参照)。 .Pp 指定されたフラグは次の値の論理和 .\".Em or Ns 'ing .Em ( or ) で作成されます。 .Pp .Bd -literal -offset indent -compact 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 シンボリックリンクを辿らない .Ed .Pp .Dv O_APPEND を設定してファイルをオープンすると、 ファイルへの書込みはすべてファイルの末尾に追加されます。 .Dv O_TRUNC が指定されていてファイルが存在する場合、ファイルは長さ 0 に 切り捨てられます。 .Dv O_EXCL が .Dv O_CREAT とともに設定されていてファイルが既に存在する場合、 .Fn open はエラーを返します。これを使用して、 簡単な排他的アクセスロッキングメカニズムを 実現できます。 .Dv O_EXCL が設定されていてパス名の最後の構成要素がシンボリックリンクの場合、 たとえシンボリックリンクが存在しない名前を指していたとしても .Fn open は処理に失敗します。 .Dv O_NONBLOCK フラグが指定されていて .Fn open 呼び出しの結果、プロセスが何らかの理由でブロックされると (たとえば、 ダイアルアップ回線でキャリアを待っている場合)、 .Fn open は即座に戻ります。プロセスがオープンしたファイルに 最初に入出力しようとしたとき、プロセスはブロックします (現時点では実装されていません)。 .Pp .Dv O_FSYNC がマスクに使用された場合、 すべての書き込みは直ちにディスクに書き込まれ、 カーネルは書き込まれたデータをキャッシュせず、 書き込むべきすべてのデータが完了するまでは この記述子に対するすべての書き込みは戻りません。 .Pp .Dv O_NOFOLLOW がマスクに使用された場合で .Fn open に渡された対象ファイルがシンボリックリンクの場合、 .Fn open は失敗します。 .Pp ファイルをオープンするときに、 .Xr flock 2 を使ったロックを得るには、共有ロックについては .Dv O_SHLOCK 、 排他的ロックについては .Dv O_EXLOCK を設定します。 .Dv O_CREAT でファイルを作成する場合、ロック要求が失敗すること はありません (ただし、下層にあるファイルシステムが ロックをサポートしている場合に限ります)。 .Pp 読み書きにおけるキャッシュの効果を最小化もしくは無くすために .Dv O_DIRECT を使用可能です。 システムは、読み書きするデータのキャッシングを避けようとします。 データのキャッシングが避けられない場合、 データのキャッシュに対する影響を最小化します。 注意せずに使用すると、本フラグは劇的に性能を劣化させます。 .Pp 正常に完了すると、 .Fn open は、ファイル記述子を示す負でない整数を返します。 処理に失敗すると -1 を返します。ファイル内の現在の位置をマークする ファイルポインタはファイルの先頭に設定されます。 .Pp 新しいファイルが作成される場合、そのグループは ファイルが含まれるディレクトリのグループに設定されます。 .Pp 新しい記述子は .Xr execve 2 システムコールを通じてオープンされたままであるように設定されます。 .Xr close 2 と .Xr fcntl 2 を参照してください。 .Pp システムには、1 つのプロセスによって同時にオープンできる ファイル記述子数に制限があります。 .Xr getdtablesize 2 は現在のシステム制限を返します。 .Sh 実装に関する注 非スレッドライブラリでは、 .Fn open は .Va open システムコールとして実装されています。 .Pp スレッドライブラリでは、 .Va open システムコールは .Fn _thread_sys_open にアセンブルされ、 .Fn open は、スレッドの再スケジュールを無効にし .Fn _thread_sys_open を呼び出す関数として実装されています。 戻る前に、 .Fn open はスレッドの再スケジュールを有効にします。 .Sh 戻り値 正常に完了すると、 .Fn open はファイル記述子である負でない整数を返します。 処理に失敗すると -1 が返され、エラーを示すために .Va errno が設定されます。 .Sh エラー 指定のファイルは次の場合を除いてオープンされます。 .Bl -tag -width Er .It Bq Er ENOTDIR パスの構成要素中にディレクトリ以外のものが含まれています。 .It Bq Er ENAMETOOLONG パス名の構成要素が 255 文字を越えているか、 またはパス名全体が 1023 文字を越えています。 .It Bq Er ENOENT 指定されたファイルが存在せず、 .Dv O_CREAT も設定されていません。 .It Bq Er ENOENT 存在しなければならないパス名の構成要素が存在しません。 .It Bq Er EACCES 指定されたパスには、検索が許可されていないディレクトリが含まれています。 .It Bq Er EACCES 要求されたパーミッション (読取りまたは書込み用、または両方) が 指定のフラグに拒否されています。 .It Bq Er EACCES .Dv O_CREAT が指定されていて、ファイルが存在せず、かつファイルを作成する ディレクトリに書込み許可がありません。 .It Bq Er ELOOP パス名を変換するときに検出されたシンボリックリンクが多すぎます。 .It Bq Er EISDIR 指定のファイルがディレクトリであり、これを書込み用に オープンするように引数が指定されています。 .It Bq Er EROFS 指定されたファイルは読取り専用ファイルシステム上にあり、 そのファイルを修正しようとしています。 .It Bq Er EMFILE プロセスは、すでにオープンできるファイル記述子に関する 制限に達しています。 .It Bq Er ENFILE システムファイルテーブルが満杯です。 .It Bq Er EMLINK .Dv O_NOFOLLOW が指定され、対象がシンボリックリンクです。 .It Bq Er ENXIO 指定のファイルはキャラクタ型特殊ファイルまたはブロック型特殊 ファイルであり、この特殊ファイルに結び付けられたデバイスは 存在していません。 .It Bq Er ENXIO 指定されたファイルは FIFO パイプで、どのプロセスからも 読取り用にオープンされていないにも関らず、 これを書込み用にオープンしようとしました。 .It Bq Er EINTR .Fn open 操作がシグナルによって割り込みされました。 .It Bq Er EOPNOTSUPP .Dv O_SHLOCK または .Dv O_EXLOCK が指定されましたが、下層となっているファイルシステムは ロックをサポートしていません。 .It Bq Er EWOULDBLOCK .Dv O_NONBLOCK と、 .Dv O_SHLOCK か .Dv O_EXLOCK のどちらかが指定されましたが、ファイルはロックされています。 .It Bq Er ENOSPC .Dv O_CREAT が指定されていて、ファイルが存在せず、新しいファイル用のエントリを 配置中のディレクトリは、そのディレクトリを含むファイルシステムに 空間が残っていないため拡張できません。 .It Bq Er ENOSPC .Dv O_CREAT が指定されていて、ファイルが存在せず、かつファイルが作成中の ファイルシステム上に未使用の inode がありません。 .It Bq Er EDQUOT .Dv O_CREAT が指定されていて、ファイルが存在せず、かつ新しいファイル用の エントリを配置中のディレクトリは、そのディレクトリを含む ファイルシステム上でディスクブロックの ユーザのクォータが枯渇したために拡張できません。 .It Bq Er EDQUOT .Dv O_CREAT が指定されていて、ファイルが存在せず、かつファイルを作成中の ファイルシステム上で inode のユーザのクォータが枯渇しています。 .It Bq Er EIO ディレクトリエントリを作成中、または .Dv O_CREAT 用の inode を割当て中に入出力エラーが発生しました。 .It Bq Er ETXTBSY ファイルは純粋な手続き (共有テキスト) ファイルで、 .Fn open が書込みアクセスを要求しましたが、ファイルは実行中です。 .It Bq Er EFAULT .Fa path は、プロセスに割り当てられたアドレス空間の範囲外を指しています。 .It Bq Er EEXIST .Dv O_CREAT と .Dv O_EXCL が指定されていて、ファイルが存在します。 .It Bq Er EOPNOTSUPP ソケットをオープンしようとしました (現時点では実装されていません)。 .It Bq Er EINVAL .Dv O_RDONLY , .Dv O_WRONLY および .Dv O_RDWR の不正な組合わせで記述子をオープンしようとしました。 .El .Sh 関連項目 .Xr chmod 2 , .Xr close 2 , .Xr dup 2 , .Xr getdtablesize 2 , .Xr lseek 2 , .Xr read 2 , .Xr umask 2 , .Xr write 2 .Sh 歴史 .Fn open 関数は .At v6 で登場しました。