open() — ファイルのオープン

標準

標準/拡張機能 C/C++ 依存項目

POSIX.1
XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _POSIX_SOURCE
#include <fcntl.h>

int open(const char *pathname, int options, …);

機能説明

ファイルをオープンし、ファイル記述子 と呼ばれる数値を戻します。

pathname 引数は、z/OS UNIX ファイルのファイル名でなければなりません。 このファイル記述子を使用して、ファイルを後続の入出力操作 (read() や write() など) において 指すことができます。プロセスによってオープンされた各ファイルには、 新しいファイル記述子が付与されます。

制約事項: この関数を、FIFO、 POSIX 端末、および文字特殊ファイルと共に使用する場合は、POSIX(ON) を実行する z/OS® XL C プログラム が必要です。

引数 pathname は、オープンしたいファイルの 名前を指定するストリングです。整数 options は、fcntl.h ヘッダー・ファイルに定義されたシンボルの ビット単位の包含 OR によって、このオープン操作のオプションを指定 します。これらのオプションは、ファイルを、読み取り、書き込み、読み書き用などに アクセスする必要があるかどうかなどを指定します。

options に O_CREAT オプションが指定されている場合、追加の引数 (...) が 必要です。この引数は、mode と呼ばれ、mode_t 型です。これは、ファイルが作成されるときに使用されるファイル許可 ビットを指定します。すべてのファイル許可ビットは、 プロセスのファイル・モード作成マスクに設定されているものを除いて、mode の ビットに設定されます。mode に使用できるシンボルのリストを以下に示します。
S_IRGRP
ファイルのグループ用の読み取り許可。
S_IROTH
ファイル所有者以外のユーザー用の読み取り許可。
S_IRUSR
ファイル所有者用の読み取り許可。
S_IRWXG
ファイルのグループ用の読み取り、書き込み、検索、または実行の許可。S_IRWXG は、S_IRGRP、S_IWGRP、および S_IXGRP のビット単位の包含 OR です。
S_IRWXO
ファイル所有者以外のユーザー用の 読み取り、書き込み、検索、または実行の許可。S_IRWXO は、S_IROTH、S_IWOTH、および S_IXOTH のビット単位の包含 OR です。
S_IRWXU
ファイル所有者用に読み取り、書き込み、および探索または実行を行います。S_IRWXG は、S_IRUSR、S_IWUSR、および S_IXUSR のビット単位の包含 OR です。
S_ISGID
実行用のグループ ID (GID) を設定する特権。exec 関数によりこのファイルが実行される場合は、プロセスの有効グループ ID がファイルのグループ ID に 設定されます。その結果、プロセスには、実際の呼び出し元の 権限ではなく、ファイル所有者と同じ権限を持ちます。
S_ISUID
実行用のユーザー ID (UID) を設定する特権。exec 関数によりこのファイルが実行される場合は、プロセスの有効ユーザー ID がファイルの所有者に 設定されます。その結果、プロセスには、実際の呼び出し元の 権限ではなく、ファイル所有者と同じ権限を持ちます。
S_ISVTX
共用テキストを指示します。実行可能ファイルとしてストレージにロードしたままにしてください。
S_IWGRP
ファイルのグループ用の書き込み許可。
S_IWOTH
ファイル所有者以外のユーザー用の書き込み許可。
S_IWUSR
ファイル所有者用の書き込み許可。
S_IXGRP
ファイルのグループ用の検索許可 (ディレクトリーの場合) または 実行許可 (ファイルの場合)。
S_IXOTH
ファイル所有者以外のユーザー用の検索許可 (ディレクトリーの場合) または実行許可 (ファイルの場合)。
S_IXUSR
ファイル所有者用の検索許可 (ディレクトリーの場合) または 実行許可 (ファイルの場合)。
ほとんどのオープン操作は、ファイル・オフセット (ファイル内で次の読み取りまたは 書き込みが行われる場所を指す標識) をファイルの先頭に置きますが、 この位置を変更できるオプションがあります。open() 操作 の options 引数には、以下のいずれか 1 つが指定されている必要があります
O_RDONLY
読み取り専用のオープン
O_WRONLY
書き込み専用のオープン
O_RDWR
読み書き両用のオープン
さらに以下の 1 つ以上を options に指定することができます。
O_APPEND
各書き込み操作の前に、ファイル・オフセットをファイルの終わりに置きます。
O_CREAT
open() の呼び出しにモード 引数があることを示します。

オープンされるファイルが既に存在している場合、O_CREAT は、 O_EXCL も指定されている場合を除いて、何の効果もありません。下記の O_EXCL を参照してください。

オープンされるファイルが存在していない場合、 ファイルは作成されます。ユーザー ID は、プロセスの実効 ID に設定 され、グループ ID はディレクトリーのグループ ID に設定されます。ファイル許可 ビットはモード に応じて設定されます。

O_CREAT が指定されていて、 ファイルが前に存在していなかった場合、open() は、正常終了すると、ファイルのアクセス時刻、 変更時刻、モディフィケーション時刻を設定します。また、親ディレクトリー内の 変更時刻とモディフィケーション時刻のフィールドも更新します。

O_EXCL

O_EXCL と O_CREAT の両方が指定されている場合、open() は、ファイルが既に存在 している場合は失敗します。O_EXCL と O_CREAT の両方が指定されていて、pathname がシンボリック・リンクを指定している場合、そのシンボリック・リンクの内容に関係なく、open() は 失敗します。

ファイルが存在するかどうかと、ファイルが存在しない場合にファイルを作成 するかどうかのチェックは、同じディレクトリー内の同じファイル名を指定した open() を O_EXCL と O_CREAT を 設定して実行している他のスレッドに関してアトミックです。

O_NOCTTY
pathname が端末を指定している場合、open() はその端末を プロセス (およびセッション) の制御端末にしません。O_NOCTTY が 指定されていない場合、以下の条件が満たされていれば、指定された端末は制御端末 になります。
  • プロセスがセッション・リーダーである。
  • セッションの制御端末がない。
  • その端末は、既に別のセッションの制御端末になっていない。
O_NONBLOCK
状況によって意味が異なります。
  • O_RDONLY または O_WRONLY で FIFO 特殊ファイルをオープンする場合:

    O_NONBLOCK が指定されている場合、読み取り専用 open() は 即座に戻ります。書き込み専用 open() は、読み取り用にその FIFO をオープンしているプロセスが他にない場合は、 エラーで戻ります。

    O_NONBLOCK が指定されていない場合、 読み取り専用 open() は、別のプロセスが書き込み用にその FIFO をオープンするまでブロックします。 書き込み専用 open() は、別のプロセスが読み取り用にその FIFO をオープンするまでブロックします。

  • 非ブロッキング open() をサポートする文字特殊ファイルをオープンする場合、 O_NONBLOCK は、後続の読み取りまたは書き込みがブロックできるかどうかを制御します。
O_TRUNC
ファイルが O_RDWR または O_WRONLY で正常にオープンされた場合、 これは、ファイルが存在していて通常のファイルである場合はファイルをゼロ長に切り捨てます。 ファイルのモードと所有者は変更されません。このオプション を O_RDONLY と共に使用するべきではありません。O_TRUNC は、FIFO 特殊ファイルまたはディレクトリーに対しては何も効力がありません。

O_TRUNC が指定されていて、ファイルが前に存在していた場合、open() は、正常終了すると、 ファイルの変更時刻とモディフィケーション時刻を更新します。

O_SYNC
同期更新を強制します。このフラグが 1 の場合、ファイルに対するすべての write() 操作 は、永続ストレージに書き込まれます。つまり、ファイル・システム・バッファーが永続記憶装置に強制的に 書き込まれます。fsync() も参照してください。

プログラムは、同期更新を実行する関数から戻るときに、 ファイルのすべてのデータが永続ストレージに書き込まれている ことを保証されます。

pathname が STREAM ファイルを指している場合、 O_NONBLOCK を、O_RDONLYO_WRONLY、または O_RDWR のいずれかと論理和演算して oflag が構成されます。他のフラグ値は STREAMS 装置 には適用されず、装置への影響はありません。値 O_NONBLOCK は、 STREAMS ファイルと関連付けられたファイル記述子に 適用される特定の関数および STREAMS ドライバーに影響します。STREAMS ドライバーについては、 O_NONBLOCK のインプリメンテーションはデバイスに依存します。

注: z/OSUNIX サービスは、どのような STREAMS 装置または疑似装置も提 供しません。有効な STREAMS ファイル記述子を open() が戻すことはあり得ません。

off_t 型のオブジェクトにおいて正しく表現できる最大値 が、オープン・ファイル記述内のオフセット最大値として設定されます。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

戻り値

正常終了した場合、open() はファイル記述子を戻します。

正常終了しなかった場合、open() は -1 を戻し、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EACCES
アクセスが拒否されました。考えられる理由は次のとおりです。
  • プロセスには、pathname 内のコンポーネントに対する検索許可がありません。
  • ファイルは存在しているが、プロセスには、フラグで指定されたようにファイルをオープン する許可がありません。
  • ファイルは存在せず、プロセスにはファイルが作成される ディレクトリーに対する書き込み許可がありません。
  • O_TRUNC は指定されたが、プロセスにはファイルに対する書き込み許可がありません。
EBUSY
プロセスは、使用中のファイルをオープンしようとしました。
EEXIST
O_CREAT と O_EXCL が指定され、指定されたファイルがシンボリック・リンクを指しているか、 または指定されたファイルが既に存在しています。
EINTR
open() がシグナルで割り込まれました。
EINVAL
options パラメーターで指定された O_RDONLY、O_WRONLY、および O_TRUNC ビット の組み合わせが無効です。
EIO
pathname 引数が STREAMS ファイルを指定していて、open() 中にハングアップまたはエラーが 発生しました。
EISDIR
pathname はディレクトリーであり、options で 書き込みアクセスまたは読み取り/書き込みアクセスが指定されています。
ELOOP
ループがシンボリック・リンクに存在しています。このエラーが出されるのは、pathname 解決で検出されたシンボリック・リンクの数が POSIX_SYMLOOP より大きい場合です。
EMFILE
プロセスがオープンできるファイル記述子の最大数に達しています。
ENAMETOOLONG
_POSIX_NO_TRUNC が有効ですが、pathname が PATH_MAX 文字より長いか、または pathname の一部のコンポーネントが NAME_MAX 文字より長くなっています。シンボリック・リンクの場合、シンボリック・リンクの代わりに使われるパス名のストリングの長さが PATH_MAX を超えています。PATH_MAX 値と NAME_MAX 値は 、pathconf() を使用して確認できます。
ENFILE
システムがオープンできるファイル記述子の最大数に達しています。
ENOENT
典型的な原因は次のとおりです。
  • O_CREAT の指定がなく、指定されたファイルが存在していません。
  • O_CREAT が指定されていて、pathname の接頭部が 存在しないか、pathname 引数が空ストリングです。
ENOMEM
pathname 引数が STREAMS ファイルを指定していて、システムはリソースを 割り振ることができません。
ENOSPC
新規ファイルを保持するには、ディレクトリーまたは ファイル・システムのスペースが不十分です。
ENOSR
pathname 引数が STREAMS ベースのファイルを指定していて、システムは STREAM を 割り振ることができません。
ENOSYS
マスター疑似端末に対して、スレーブ初期設定が完了しませんでした。
ENOTDIR
pathname のコンポーネントがディレクトリーではありません。
ENXIO
O_NONBLOCK と O_WRONLY が指定され、指定されたファイルは FIFO ですが、 そのファイルを読み取り用にオープンしているプロセスがありません。疑似端末の場合、要求された マイナー番号が、インストール済み環境でサポートされている最大番号を超えています。
EPERM
スレーブ疑似端末に対して、以下のいずれかの理由で、オープン許可が拒否されました。
  • マスター疑似端末がオープンされた後の、スレーブの最初のオープン であり、それら 2 つのオープンのプロセスに関連したユーザー ID が 同じでありません。
  • マスター疑似端末がオープンされた後にセキュリティー・システム で内部エラーがありました。
  • スレーブをオープンしようとしたときに、前のオープンで使用されたのと異なるパス名を使用しました。
EROFS
pathname は読み取り専用ファイル・システムにあり、 オプション O_WRONLY、O_RDWR、O_TRUNC、または O_CREAT (ファイルが存在しない場合) のうち 1 つ 以上が指定されました。

以下の例は、出力ファイルを付加用にオープンします。
   int fd;
   fd = open("outfile",O_WRONLY | O_APPEND);
以下のステートメントは、新しいファイルを、作成するユーザー用に読み取り/書き込み/実行許可で 作成します。ファイルが既に存在する場合、open() は失敗します。
   fd = open("newfile",O_WRONLY|O_CREAT|O_EXCL,S_IRWXU);

関連情報