Unix-system-calls-creat

提供: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)を使用してファイルステータスフラグを取得し、(場合によっては)変更できることです。

ファイル作成フラグとファイルステータスフラグの完全なリストは次のとおりです。

エラーコード

説明

*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 ()呼び出しは、読み取り/書き込みファイル記述子を返す可能性があります。

次の記号定数が提供されます

モード

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

エラー

Error Code Description
*EACCES * The requested access to the file is not allowed, or search permission is denied for one of the directories in the path prefix of pathname, or the file did not exist yet and write access to the parent directory is not allowed. (See also* path_resolution*(2).)
*EEXIST * pathname already exists and* O_CREAT and O_EXCL* were used.
EFAULT pathname points outside your accessible address space.
*EISDIR * pathname refers to a directory and the access requested involved writing (that is,* O_WRONLY or O_RDWR* is set).
*ELOOP * Too many symbolic links were encountered in resolving pathname, or* O_NOFOLLOW* was specified but pathname was a symbolic link.
EMFILE The process already has the maximum number of files open.
ENAMETOOLONG pathname was too long.
ENFILE The system limit on the total number of open files has been reached.
ENODEV pathname refers to a device special file and no corresponding device exists. (This is a Linux kernel bug; in this situation ENXIO must be returned.)
ENOENT O_CREAT is not set and the named file does not exist. Or, a directory component in pathname does not exist or is a dangling symbolic link.
ENOMEM Insufficient kernel memory was available.
ENOSPC pathname was to be created but the device containing pathname has no room for the new file.
*ENOTDIR * A component used as a directory in pathname is not, in fact, a directory, or* O_DIRECTORY* was specified and pathname was not a directory.
ENXIO O_NONBLOCK
O_WRONLY is set, the named file is a FIFO and no process has the file open for reading. Or, the file is a device special file and no corresponding device exists. EOVERFLOW
pathname refers to a regular file, too large to be opened; see O_LARGEFILE above. *EPERM *
The* O_NOATIME* flag was specified, but the effective user ID of the caller did not match the owner of the file and the caller was not privileged (CAP_FOWNER). EROFS
pathname refers to a file on a read-only filesystem and write access was requested. ETXTBSY
pathname refers to an executable image which is currently being executed and write access was requested. *EWOULDBLOCK *

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