Unix-system-calls-open
[top]#
[[File:]]
[[File:]] |
|Web |This Site
- 初心者向けのUnix *
- Unix-ホーム
- Unix-はじめに
- Unix-ファイル管理
- Unix-ディレクトリ
- Unix-ファイル権限
- Unix-環境
- Unix-基本ユーティリティ
- Unix-パイプとフィルタ
- Unix-プロセス
- Unix-コミュニケーション
- Unix-The Vi Editor
- Unix Shellプログラミング*
- Unix-シェルとは?
- Unix-変数の使用
- Unix-特殊変数
- Unix-配列の使用
- Unix-基本的な演算子
- Unix-意思決定
- Unix-シェルループ
- Unix-ループ制御
- Unix-シェル置換
- Unix-引用メカニズム
- Unix-IOリダイレクト
- UNIX-シェル関数
- Unix-マンページヘルプ
- 高度なUnix *
- Unix-正規表現
- Unix-ファイルシステムの基本
- Unix-ユーザー管理
- Unix-システムパフォーマンス
- Unix-システムログ
- Unix-信号とトラップ
- Unixの便利なリファレンス*
- Unix-便利なコマンド
- Unix-クイックガイド
- Unix-組み込み関数
- Unix-システムコール
- Unix-コマンドリスト
- Unixの役立つリソース*
- Unix役立つリソース
選択した読書
- http://www.finddevguides.com/computer_glossary [コンピュータ用語集] *http://www.finddevguides.com/computer_whoiswho[Who is Who]
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)を参照)。
パラメーター_flags_には、 O_RDONLY 、 O_WRONLY 、または* O_RDWR。*のいずれかの_access mode_のいずれかを含める必要があります。これらの要求は、それぞれ、ファイルを読み取り専用、書き込み専用、または読み取り/書き込みで開きます。
さらに、0個以上のファイル作成フラグとファイルステータスフラグをビット単位で(または_flags_に)挿入できます。 _ファイル作成フラグ_は、 O_CREAT 、 O_EXCL 、 O_NOCTTY 、および O_TRUNC です。 _file status flags_は、以下にリストされている残りのフラグのすべてです。 これらの2つのフラググループの違いは、 fcntl (2)を使用してファイルステータスフラグを取得し、(場合によっては)変更できることです。 ファイル作成フラグとファイルステータスフラグの完全なリストは次のとおりです。
Tag
説明
ファイルは追加モードで開かれます。 各 write ()の前に、 lseek ()の場合と同様に、ファイルオフセットがファイルの末尾に配置されます。 O_APPEND は、複数のプロセスが一度にファイルにデータを追加すると、NFSファイルシステム上のファイルが破損する可能性があります。 これは、NFSがファイルへの追加をサポートしていないため、クライアントカーネルがそれをシミュレートする必要があるためです。これは競合状態なしでは実行できません。
信号駆動型I/Oを有効にします。このファイル記述子で入力または出力が可能になったときに、信号(デフォルトではSIGIOですが、これは fcntl (2)で変更できます)を生成します。 この機能は、端末、擬似端末、ソケット、および(Linux 2.6以降)パイプおよびFIFOでのみ使用可能です。 詳細については、 fcntl (2)を参照してください。
ファイルが存在しない場合は作成されます。 ファイルの所有者(ユーザーID)は、プロセスの有効なユーザーIDに設定されます。 グループの所有権(グループID)は、プロセスの有効なグループIDまたは親ディレクトリのグループIDに設定されます(ファイルシステムのタイプとマウントオプション、および親ディレクトリのモードに依存します。たとえば、 mount (8)で説明されているext2ファイルシステムのオプション_bsdgroups_および_sysvgroups_。
このファイルとの間のI/Oのキャッシュ効果を最小限に抑えるようにしてください。 一般に、これはパフォーマンスを低下させますが、アプリケーションが独自のキャッシュを実行する場合など、特別な状況で役立ちます。 ファイルI/Oは、ユーザー空間のバッファーとの間で直接行われます。 I/Oは同期です。つまり、 read (2)または write (2)が完了すると、データが転送されたことが保証されます。 Linux 2.4では、転送サイズ、およびユーザーバッファーとファイルオフセットのアライメントは、すべてファイルシステムの論理ブロックサイズの倍数でなければなりません。 Linux 2.6では、アライメントはデバイスのブロックサイズに適合する必要があります。
ブロックデバイス用のセマンティック上類似した(非推奨の)インターフェイスは、 raw (8)で説明されています。
_pathname_がディレクトリではない場合、オープンに失敗します。 このフラグはLinux固有であり、カーネルバージョン2.1.126で追加されました。これは、 opendir (3)がFIFOまたはテープデバイスで呼び出された場合にサービス拒否の問題を回避しますが、実装以外では使用しないでください opendir の。
(LFS)サイズが_off_t_で表現できない(ただし、_off64_t_で表現できる)ファイルを開くことができます。
(Linux 2.6.8以降)ファイルが read (2)の場合、ファイルの最終アクセス時刻(inodeのst_atime)を更新しないでください。 このフラグは、インデックス作成またはバックアッププログラムで使用するためのもので、使用するとディスクアクティビティの量を大幅に削減できます。 このフラグは、すべてのファイルシステムで有効なわけではありません。 1つの例は、サーバーがアクセス時間を管理するNFSです。
_pathname_が端末デバイスを参照している場合( tty (4)を参照)、プロセスに端末がない場合でも、プロセスの制御端末にはなりません。
_pathname_がシンボリックリンクの場合、オープンは失敗します。 これは、バージョン2.1.126でLinuxに追加されたFreeBSD拡張機能です。 パス名の以前のコンポーネントのシンボリックリンクは引き続き使用されます。
可能な場合、ファイルは非ブロックモードで開かれます。 open ()も、返されるファイル記述子に対する後続の操作も、呼び出しプロセスを待機させません。 FIFO(名前付きパイプ)の処理については、 fifo (7)も参照してください。 必須のファイルロックおよびファイルリースと組み合わせた O_NONBLOCK の効果については、 fcntl (2)を参照してください。
ファイルは同期I/O用に開かれます。 結果のファイル記述子の write ()は、データが基礎となるハードウェアに物理的に書き込まれるまで呼び出しプロセスをブロックします。 ただし、以下の制限事項を参照してください。
ファイルが既に存在し、通常のファイルであり、オープンモードで書き込みが許可されている(つまり、O_RDWRまたはO_WRONLY)場合、長さ0に切り捨てられます。 ファイルがFIFOまたは端末デバイスファイルである場合、O_TRUNCフラグは無視されます。 それ以外の場合、O_TRUNCの効果は指定されていません。
これらのオプションフラグの一部は、ファイルを開いた後に fcntl ()を使用して変更できます。
引数_mode_は、新しいファイルが作成された場合に使用する許可を指定します。 プロセスの umask によって通常の方法で変更されます。作成されたファイルの許可は*(mode&〜umask)です。 このモードは、新しく作成されたファイルの今後のアクセスにのみ適用されることに注意してください。読み取り専用ファイルを作成する *open ()呼び出しは、読み取り/書き込みファイル記述子を返す可能性があります。
_mode_には、次の記号定数が用意されています。
00700ユーザー(ファイル所有者)には読み取り、書き込み、実行の許可があります
00400ユーザーには読み取り許可があります
00200ユーザーには書き込み権限があります
00100ユーザーには実行権限があります
00070グループには読み取り、書き込み、実行の許可があります
00040グループには読み取り権限があります
00020グループには書き込み権限があります
00010グループには実行権限があります
00007他には読み取り、書き込み、実行の許可があります
00004他には読み取り許可があります
00002他には書き込み許可があります
00001他には実行権限があります
返り値
ノート
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
説明
ファイルへの要求されたアクセスが許可されていないか、パスプレフィックス_pathname_のいずれかのディレクトリの検索許可が拒否されているか、ファイルがまだ存在せず、親ディレクトリへの書き込みアクセスが許可されていません。 ( path_resolution (2)も参照してください。)
_pathname_はすでに存在し、 O_CREAT および O_EXCL が使用されました。
_pathname_は、アクセス可能なアドレス空間の外側を指します。
_pathname_はディレクトリを指し、要求されたアクセスには書き込みが含まれます(つまり、 O_WRONLY または O_RDWR が設定されます)。
_pathname_の解決中に検出されたシンボリックリンクが多すぎるか、 O_NOFOLLOW が指定されたが、_pathname_がシンボリックリンクでした。
プロセスはすでに最大数のファイルを開いています。
_pathname_が長すぎました。
開いているファイルの総数がシステムの制限に達しました。
_pathname_はデバイス特殊ファイルを指し、対応するデバイスは存在しません。 (これはLinuxカーネルのバグです。この状況ではENXIOを返す必要があります。)
O_CREATは設定されておらず、指定されたファイルは存在しません。 または、_pathname_のディレクトリコンポーネントが存在しないか、ダングリングシンボリックリンクです。
カーネルメモリが不足していました。
_pathname_は作成されますが、_pathname_を含むデバイスには新しいファイル用のスペースがありません。
_pathname_でディレクトリとして使用されるコンポーネントは、実際にはディレクトリではないか、 O_DIRECTORY が指定されていて、_pathname_がディレクトリではありませんでした。
O_NONBLOCK | O_WRONLYが設定され、指定されたファイルはFIFOであり、読み取り用にファイルを開いているプロセスはありません。 または、ファイルはデバイス特殊ファイルであり、対応するデバイスは存在しません。
オーバーフロー
_pathname_は、開くには大きすぎる通常のファイルを指します。上記のO_LARGEFILEを参照してください。
_pathname_は読み取り専用ファイルシステム上のファイルを参照し、書き込みアクセスが要求されました。
_pathname_は、現在実行され、書き込みアクセスが要求された実行可能イメージを指します。
NOTE
Linuxでは、O_NONBLOCKフラグは開くことを望んでいるが、必ずしも読み取りまたは書き込みの意図があるとは限らないことを示します。 これは通常、 ioctl (2)で使用するファイル記述子を取得するためにデバイスを開くために使用されます。
準拠
SVr4、4.3BSD、POSIX.1-2001。 O_NOATIME 、 O_NOFOLLOW 、および O_DIRECTORY フラグはLinux固有です。 定義を取得するには、 _ GNU_SOURCE マクロを定義する必要がある場合があります。
BUGS
「O_DIRECTについて私をいつも悩ませてきたのは、インターフェイス全体が馬鹿げていることであり、恐らくいくつかの深刻な心を制御する物質に関する混乱した猿によって設計されたということです。」 —ライナス
現在、 open ()を呼び出すときに O_ASYNC を指定して、信号駆動型I/Oを有効にすることはできません。このフラグを有効にするには、 fcntl (2)を使用します。
制限事項
NFSの基礎となるプロトコルには多くの不備があり、特に O_SYNC および O_NDELAY に影響を及ぼします。
POSIXは、フラグ O_SYNC 、 O_DSYNC 、および O_RSYNC に対応する、同期I/Oの3つの異なるバリアントを提供します。 現在(2.1.130)これらはすべてLinuxの同義語です。
関連項目
- http://www.finddevguides.com/unix_system_calls/close [閉じる(2)]
- dup(2)
- fcntl(2)
- http://www.finddevguides.com/unix_system_calls/link [リンク(2)]
- lseek(2)
- mknod(2)
- mount(2)
- mmap(2)
- openat(2)
- path_resolution(2)
- read(2)
- socket(2)
- stat(2)
- umask(2)
- unlink(2)
- write(2)
[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]
広告
Advertisements |