Linux Command Openを学ぶ

シノプシス

#include "A HREF =" file:/usr/include/sys/types.h "> sys / types.h> #include" A HREF = "file:/usr/include/sys/stat.h"> sys / stat.h> #include "A HREF ="ファイル:/usr/include/fcntl.h "> fcntl.h> int open(const char * pathname 、int flags ); int open(const char * パス名 、int フラグ 、mode_t モード ); int creat(const char * pathname 、mode_t mode );

説明

open()システムコールのlinux コマンドは、パス名をファイル記述子に変換するために使用されます( 読み取り書き込みなどの後続のI / Oで使用するための小さな負でない整数)。 呼び出しが成功すると、 ファイルディスクリプタは、プロセスに対して現在開いていない最も低いファイルディスクリプタになります。 この呼び出しは、他のプロセスと共有されていない新しいオープンファイルを作成します。 (しかし、共有されたオープンファイルは、 fork (2)システムコールを介して発生することがあります)。新しいファイル記述子は、exec関数間で開いたままになるように設定されています( fcntl (2)を参照)。 ファイルオフセットは、ファイルの先頭に設定されます。

パラメータflagsは、ファイルread-only、write-onlyまたはread / writeをそれぞれbitwise または 'd'にすることを要求するO_RDONLYO_WRONLYまたはO_RDWRのうちの1つです。

O_CREAT

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

O_EXCL

O_CREATとともに使用すると、ファイルがすでに存在する場合はエラーとなり、 オープンは失敗します。 この文脈では、シンボリックリンクはどこにポイントされていても存在します。 NFSファイルシステムO_EXCLが壊れていると、ロックタスクを実行するためにそれに依存するプログラムに競合状態が含まれます。 ロックファイルを使用してアトミックファイルロックを実行するソリューションは、同じfs(たとえば、hostnameとpidを組み込む)で一意のファイルを作成し、 link (2)を使用してロックファイルにリンクします。 link()が0を返した場合、ロックは成功です。 それ以外の場合は、一意のファイルのstat (2)を使用してリンクカウントが2に増加したかどうかを確認します。この場合、ロックも成功します。

O_NOCTTY

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

O_TRUNC

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

O_APPEND

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

O_NONBLOCKまたはO_NDELAY

可能であれば、ファイルは非ブロックモードで開かれます。 返されるファイル記述子のオープン操作もそれに続く操作も、呼び出しプロセスを待機させません。 FIFO(名前付きパイプ)の処理については、 fifo (4)も参照してください。 このモードは、FIFO以外のファイルに影響を与える必要はありません。

O_SYNC

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

O_NOFOLLOW

pathnameがシンボリックリンクの場合、オープンは失敗します。 これはFreeBSDの拡張版で、バージョン2.1.126のLinuxに追加されました。 パス名の以前のコンポーネントのシンボリックリンクには引き続き従います。 glibc 2.0.100以降のヘッダーには、このフラグの定義が含まれています。 2.1.126より前のカーネルは、使用されていれば無視します。

O_DIRECTORY

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

O_DIRECT

このファイルとのI / Oのキャッシュ効果を最小限に抑えてください。 一般的にこれはパフォーマンスを低下させますが、アプリケーションが独自のキャッシングを行うような特殊な状況では便利です。 ファイルI / Oは、ユーザー空間バッファーに直接/から行われます。 I / Oは同期式です。つまり、 read (2)またはwrite (2)システムコールの完了時に、データが転送されたことが保証されます。 転送サイズ、およびユーザバッファとファイルオフセットのアラインメントはすべて、ファイルシステムの論理ブロックサイズの倍数でなければなりません。
このフラグは、多くのUnixライクなシステムでサポートされています。 カーネルバージョン2.4.10のLinuxでサポートが追加されました。
ブロックデバイスのための意味的に似たインタフェースがraw (8)に記述されています。

O_ASYNC

このファイル記述子で入力または出力が可能になると、シグナル(デフォルトではSIGIOですが、これはfcntl (2)で変更できます)を生成します。 この機能は、端末、擬似端末、およびソケットでのみ使用できます。 詳細は、 fcntl (2)を参照してください。

O_LARGEFILE

ラージファイルシステムをサポートする32ビットシステムでは、サイズを31ビットで表現できないファイルを開くことができます。

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

引数modeは、新しいファイルが作成された場合に使用する権限を指定します。 通常の方法でプロセスのumaskによって変更されます。作成されるファイルのパーミッションは(mode&〜umask)です。 このモードは、新しく作成されたファイルの将来のアクセスにのみ適用されることに注意してください。 読み取り専用ファイルを作成するオープンコールは、読み取り/書き込みファイル記述子を返すことがあります。

modeには次の記号定数が用意されています

S_IRWXU

00700ユーザー(ファイル所有者)が読み取り、書き込み、および実行許可を持っている

S_IRUSR(S_IREAD)

00400ユーザーに読み取り権があります

S_IWUSR(S_IWRITE)

00200ユーザーに書き込み権限があります

S_IXUSR(S_IEXEC)

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他に実行許可があります

modeO_CREATフラグにあるときに指定しなければならず、そうでなければ無視される。

creatは、 O_CREAT | O_WRONLY | O_TRUNCに等しいフラグで openと同等です

戻り値

opencreatは新しいファイル記述子を返します 。エラーが発生した場合は-1を返しますerrnoが適切に設定されている場合)。 openはデバイス特殊ファイルを開くことができますが、 creatはそれらを作成できません。代わりにmknod (2)を使用してください。

UIDマッピングを有効にしたNFSファイルシステムでは、 openはファイル記述子を返すかもしれませんが、 read (2)要求はEACCESで拒否されます。 これは、クライアントがアクセス権をチェックすることでオープンを実行するが、読み取りおよび書き込み要求時にUIDマッピングがサーバーによって実行されるためです。

ファイルが新しく作成された場合、そのatime、ctime、mtimeフィールドは現在の時刻に設定され、親ディレクトリのctimeフィールドとmtimeフィールドも設定されます。 それ以外の場合、O_TRUNCフラグのためにファイルが変更された場合、そのctimeフィールドとmtimeフィールドは現在の時刻に設定されます。

エラー

EEXIST

pathnameはすでに存在し、 O_CREATO_EXCLが使用されています。

EISDIR

pathnameはディレクトリを参照し、要求されたアクセスには書き込みが必要です(つまり、 O_WRONLYまたはO_RDWRが設定されています)。

EACCES

要求されたファイルへのアクセスが許可されていないか、またはpathnameのディレクトリの1つが検索(実行)パーミッションを許可していないか、またはファイルがまだ存在せず、親ディレクトリへの書き込みアクセスが許可されていません。

ENAMETOOLONG

パス名が長すぎます。

ENOENT

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

ENOTDIR

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

ENXIO

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

ENODEV

pathnameはデバイス特殊ファイルを参照し、対応するデバイスは存在しません。 (これはLinuxカーネルのバグです。この場合、ENXIOを返さなければなりません)。

EROFS

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

ETXTBSY

pathnameは、現在実行されており、書き込みアクセスが要求された実行可能イメージを参照します。

EFAULT

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

ELOOP

pathnameの解決に多すぎるシンボリックリンクが見つかったか、 O_NOFOLLOWが指定されましたがpathnameはシンボリックリンクでした。

ENOSPC

pathnameを作成しようとしましたが、 パス名を含むデバイスには新しいファイルのための空きがありません。

ENOMEM

不十分なカーネルメモリが利用可能でした。

EMFILE

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

ENFILE

システムで開いているファイルの合計数に制限があります。

従う

SVr4、SVID、POSIX、X / OPEN、BSD 4.3 O_NOFOLLOWO_DIRECTORYフラグはLinux特有のものです。 定義を得るために_GNU_SOURCEマクロを定義しなければならないかもしれません。

制限事項

NFSの基礎となるプロトコルには、 O_SYNCO_NDELAYの間で影響を与える多くの情報があります

POSIXは、 O_SYNCO_DSYNCO_RSYNCのフラグに対応する同期I / Oの3つの異なるバリエーションを提供します。 現在のところ(2.1.130)、これはLinuxでは同義語です。