Unix-system-calls-open

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

open()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

open、creat-ファイルまたはデバイスを開き、場合によっては作成します

概要

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> 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 ファイル記述子フラグは最初は無効になっています)。 ファイルオフセットは、ファイルの先頭に設定されます( lseek (2)を参照)。

*open* ()を呼び出すと、新しい_open file description_が作成されます。これは、システム全体のオープンファイルのテーブルのエントリです。 このエントリは、ファイルオフセットとファイルステータスフラグ( *fcntl* () *F_SETFL* 操作で変更可能)を記録します。 ファイル記述子は、これらのエントリの1つへの参照です。 _pathname_が後で削除または変更されて別のファイルを参照する場合、この参照は影響を受けません。 新しいオープンファイルの説明は、最初は他のプロセスとは共有されませんが、 *fork* (2)を介して共有される場合があります。

パラメーター_flags_には、 O_RDONLYO_WRONLY 、または* O_RDWR。*のいずれかの_access mode_のいずれかを含める必要があります。これらの要求は、それぞれ、ファイルを読み取り専用、書き込み専用、または読み取り/書き込みで開きます。

さらに、0個以上のファイル作成フラグとファイルステータスフラグをビット単位で(または_flags_に)挿入できます。 _ファイル作成フラグ_は、 O_CREATO_EXCLO_NOCTTY 、および O_TRUNC です。 _file status flags_は、以下にリストされている残りのフラグのすべてです。 これらの2つのフラググループの違いは、 fcntl (2)を使用してファイルステータスフラグを取得し、(場合によっては)変更できることです。 ファイル作成フラグとファイルステータスフラグの完全なリストは次のとおりです。

Tag

説明

*O_APPEND*

ファイルは追加モードで開かれます。 各 write ()の前に、 lseek ()の場合と同様に、ファイルオフセットがファイルの末尾に配置されます。 O_APPEND は、複数のプロセスが一度にファイルにデータを追加すると、NFSファイルシステム上のファイルが破損する可能性があります。 これは、NFSがファイルへの追加をサポートしていないため、クライアントカーネルがそれをシミュレートする必要があるためです。これは競合状態なしでは実行できません。

*O_ASYNC*

信号駆動型I/Oを有効にします。このファイル記述子で入力または出力が可能になったときに、信号(デフォルトではSIGIOですが、これは fcntl (2)で変更できます)を生成します。 この機能は、端末、擬似端末、ソケット、および(Linux 2.6以降)パイプおよびFIFOでのみ使用可能です。 詳細については、 fcntl (2)を参照してください。

*O_CREAT*

ファイルが存在しない場合は作成されます。 ファイルの所有者(ユーザーID)は、プロセスの有効なユーザーIDに設定されます。 グループの所有権(グループID)は、プロセスの有効なグループIDまたは親ディレクトリのグループIDに設定されます(ファイルシステムのタイプとマウントオプション、および親ディレクトリのモードに依存します。たとえば、 mount (8)で説明されているext2ファイルシステムのオプション_bsdgroups_および_sysvgroups_。

*O_DIRECT*

このファイルとの間のI/Oのキャッシュ効果を最小限に抑えるようにしてください。 一般に、これはパフォーマンスを低下させますが、アプリケーションが独自のキャッシュを実行する場合など、特別な状況で役立ちます。 ファイルI/Oは、ユーザー空間のバッファーとの間で直接行われます。 I/Oは同期です。つまり、 read (2)または write (2)が完了すると、データが転送されたことが保証されます。 Linux 2.4では、転送サイズ、およびユーザーバッファーとファイルオフセットのアライメントは、すべてファイルシステムの論理ブロックサイズの倍数でなければなりません。 Linux 2.6では、アライメントはデバイスのブロックサイズに適合する必要があります。

ブロックデバイス用のセマンティック上類似した(非推奨の)インターフェイスは、 raw (8)で説明されています。

*O_DIRECTORY*

_pathname_がディレクトリではない場合、オープンに失敗します。 このフラグはLinux固有であり、カーネルバージョン2.1.126で追加されました。これは、 opendir (3)がFIFOまたはテープデバイスで呼び出された場合にサービス拒否の問題を回避しますが、実装以外では使用しないでください opendir の。

*O_EXCL*
*O_CREAT* で使用した場合、ファイルが既に存在する場合はエラーになり、 *open* ()は失敗します。 このコンテキストでは、それが指す場所に関係なく、シンボリックリンクが存在します。 *O_EXCL* はNFSファイルシステムでは壊れています。ロックタスクを実行するためにこれに依存するプログラムには、競合状態が含まれます。 ロックファイルを使用してアトミックファイルロックを実行するためのソリューションは、同じファイルシステム上に一意のファイルを作成し(ホスト名とpidを組み込むなど)、 *link* (2)を使用してロックファイルへのリンクを作成することです。 *link* ()が0を返す場合、ロックは成功しています。 そうでない場合は、一意のファイルで *stat* (2)を使用して、リンクカウントが2に増加したかどうかを確認します。この場合、ロックも成功します。
*O_LARGEFILE*

(LFS)サイズが_off_t_で表現できない(ただし、_off64_t_で表現できる)ファイルを開くことができます。

*O_NOATIME*

(Linux 2.6.8以降)ファイルが read (2)の場合、ファイルの最終アクセス時刻(inodeのst_atime)を更新しないでください。 このフラグは、インデックス作成またはバックアッププログラムで使用するためのもので、使用するとディスクアクティビティの量を大幅に削減できます。 このフラグは、すべてのファイルシステムで有効なわけではありません。 1つの例は、サーバーがアクセス時間を管理するNFSです。

*O_NOCTTY*

_pathname_が端末デバイスを参照している場合( tty (4)を参照)、プロセスに端末がない場合でも、プロセスの制御端末にはなりません。

*O_NOFOLLOW*

_pathname_がシンボリックリンクの場合、オープンは失敗します。 これは、バージョン2.1.126でLinuxに追加されたFreeBSD拡張機能です。 パス名の以前のコンポーネントのシンボリックリンクは引き続き使用されます。

*O_NONBLOCK* または *O_NDELAY*

可能な場合、ファイルは非ブロックモードで開かれます。 open ()も、返されるファイル記述子に対する後続の操作も、呼び出しプロセスを待機させません。 FIFO(名前付きパイプ)の処理については、 fifo (7)も参照してください。 必須のファイルロックおよびファイルリースと組み合わせた O_NONBLOCK の効果については、 fcntl (2)を参照してください。

*O_SYNC*

ファイルは同期I/O用に開かれます。 結果のファイル記述子の write ()は、データが基礎となるハードウェアに物理的に書き込まれるまで呼び出しプロセスをブロックします。 ただし、以下の制限事項を参照してください

*O_TRUNC*

ファイルが既に存在し、通常のファイルであり、オープンモードで書き込みが許可されている(つまり、O_RDWRまたはO_WRONLY)場合、長さ0に切り捨てられます。 ファイルがFIFOまたは端末デバイスファイルである場合、O_TRUNCフラグは無視されます。 それ以外の場合、O_TRUNCの効果は指定されていません。

これらのオプションフラグの一部は、ファイルを開いた後に fcntl ()を使用して変更できます。

引数_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他には読み取り、書き込み、実行の許可があります

*S_IROTH*

00004他には読み取り許可があります

*S_IWOTH*

00002他には書き込み許可があります

*S_IXOTH*

00001他には実行権限があります

*O_CREAT* が_flags_にある場合は_mode_を指定する必要があり、そうでない場合は無視されます。
*creat* ()は *open* ()と同等で、_flags_は *O_CREAT | O_WRONLY | O_TRUNC* に等しくなります。

返り値

*open* ()および *creat* ()は新しいファイル記述子を返します。エラーが発生した場合は-1を返します(この場合、_errno_は適切に設定されます)。

ノート

*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フィールドは現在の時刻に設定されます。

エラー

Tag

説明

*EACCES*

ファイルへの要求されたアクセスが許可されていないか、パスプレフィックス_pathname_のいずれかのディレクトリの検索許可が拒否されているか、ファイルがまだ存在せず、親ディレクトリへの書き込みアクセスが許可されていません。 ( path_resolution (2)も参照してください。)

*EEXIST*

_pathname_はすでに存在し、 O_CREAT および O_EXCL が使用されました。

*EFAULT*

_pathname_は、アクセス可能なアドレス空間の外側を指します。

*EISDIR*

_pathname_はディレクトリを指し、要求されたアクセスには書き込みが含まれます(つまり、 O_WRONLY または O_RDWR が設定されます)。

*ELOOP*

_pathname_の解決中に検出されたシンボリックリンクが多すぎるか、 O_NOFOLLOW が指定されたが、_pathname_がシンボリックリンクでした。

*EMFILE*

プロセスはすでに最大数のファイルを開いています。

*ENAMETOOLONG*

_pathname_が長すぎました。

*ENFILE*

開いているファイルの総数がシステムの制限に達しました。

*ENODEV*

_pathname_はデバイス特殊ファイルを指し、対応するデバイスは存在しません。 (これはLinuxカーネルのバグです。この状況ではENXIOを返す必要があります。)

*ENOENT*

O_CREATは設定されておらず、指定されたファイルは存在しません。 または、_pathname_のディレクトリコンポーネントが存在しないか、ダングリングシンボリックリンクです。

*ENOMEM*

カーネルメモリが不足していました。

*ENOSPC*

_pathname_は作成されますが、_pathname_を含むデバイスには新しいファイル用のスペースがありません。

*ENOTDIR*

_pathname_でディレクトリとして使用されるコンポーネントは、実際にはディレクトリではないか、 O_DIRECTORY が指定されていて、_pathname_がディレクトリではありませんでした。

*ENXIO*

O_NONBLOCK | O_WRONLYが設定され、指定されたファイルはFIFOであり、読み取り用にファイルを開いているプロセスはありません。 または、ファイルはデバイス特殊ファイルであり、対応するデバイスは存在しません。

オーバーフロー

_pathname_は、開くには大きすぎる通常のファイルを指します。上記のO_LARGEFILEを参照してください。

*EPERM*
*O_NOATIME* フラグが指定されましたが、呼び出し元の有効なユーザーIDがファイルの所有者と一致せず、呼び出し元に特権がありません( *CAP_FOWNER* )。
*EROFS*

_pathname_は読み取り専用ファイルシステム上のファイルを参照し、書き込みアクセスが要求されました。

*ETXTBSY*

_pathname_は、現在実行され、書き込みアクセスが要求された実行可能イメージを指します。

*EWOULDBLOCK*
*O_NONBLOCK* フラグが指定され、ファイルに互換性のないリースが保持されていました( *fcntl* (2)を参照)。

NOTE

Linuxでは、O_NONBLOCKフラグは開くことを望んでいるが、必ずしも読み取りまたは書き込みの意図があるとは限らないことを示します。 これは通常、 ioctl (2)で使用するファイル記述子を取得するためにデバイスを開くために使用されます。

準拠

SVr4、4.3BSD、POSIX.1-2001。 O_NOATIMEO_NOFOLLOW 、および O_DIRECTORY フラグはLinux固有です。 定義を取得するには、 _ GNU_SOURCE マクロを定義する必要がある場合があります。

*O_RDONLYの(未定義の)効果| O_TRUNC* は実装によって異なります。 多くのシステムでは、ファイルは実際に切り捨てられます。
*O_DIRECT* フラグはSGI IRIXで導入され、Linux 2.4の場合と同様のアライメント制限があります。 IRIXには、適切な配置とサイズを照会するためのfcntl(2)呼び出しもあります。 FreeBSD 4.xは同じ名前のフラグを導入しましたが、アライメントの制限はありません。 Linuxのカーネルバージョン2.4.10でサポートが追加されました。 古いLinuxカーネルは、このフラグを単に無視します。 定義を取得するには、 *_ GNU_SOURCE* マクロを定義する必要があります。

BUGS

「O_DIRECTについて私をいつも悩ませてきたのは、インターフェイス全体が馬鹿げていることであり、恐らくいくつかの深刻な心を制御する物質に関する混乱した猿によって設計されたということです。」 —ライナス

現在、 open ()を呼び出すときに O_ASYNC を指定して、信号駆動型I/Oを有効にすることはできません。このフラグを有効にするには、 fcntl (2)を使用します。

制限事項

NFSの基礎となるプロトコルには多くの不備があり、特に O_SYNC および O_NDELAY に影響を及ぼします。

POSIXは、フラグ O_SYNCO_DSYNC 、および O_RSYNC に対応する、同期I/Oの3つの異なるバリアントを提供します。 現在(2.1.130)これらはすべてLinuxの同義語です。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements