##open(2) ファイルを開く
ファイルを開きファイル・ディスクリプタを返す。
ファイルは通常ファイル、シンボリックリンク、ディレクトリ、特殊ファイルなど、ファイルとして表現されるものが対象。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, [mode_t mode])
###引数
pathname:
-----------------------------------------------
ファイルの場所を指定。
絶対パスか、openをコールしたプロセスからの相対パス。
flags:
-----------------------------------------------
アクセスレベルの設定。
次の打ちのうちいずれかは必須。
O_RDONLY :読み取り専用
O_WRONLY :書き込み専用
O_RDWR :読み書き用
加えて他のフラグをOR演算で複数指定できる。
mode:
-----------------------------------------------
ファイルへのアクセス権限。
ファイルを新規作成する場合は必須。
新規作成とは O_CREAT フラグが指定されているという意味。
それ以外では無視される。
###戻り値
ファイル・ディスクリプタ(正の整数:int)
openに失敗した場合は-1。
####主なフラグ
O_APPEND
ファイルを追加モードでオープン。
(ファイル・ポインタをファイルの最後に移動する。)
O_CREAT
ファイルが存在しなかった場合作成する。
O_TRUNC
ファイルサイズが 0 になるよう上書きする。
つまり、既存の内容を破棄する。
よってファイルが存在し上書き可能な状態で開かれている必要がある。
O_CLOEXEC (Linux 2.6.23 以降)
新しいファイルディスクリプタに対して close-on-exec フラグを有効にする。
規定ではexecve(2)したあと、ファイルは自動的に閉じられないが、
close-on-execフラグが有効な場合は自動的に閉じられる。
O_EXCL
O_CREAT と一緒に使用された場合、
ファイルが既に存在した場合はエラーとなり、open ()は失敗する。
ファイルがシンボリックリンクであり、それがどこを指していても、open ()は失敗する。
O_EXCL は NFS ファイル・システムでは機能しない、
O_NOFOLLOW
pathname がシンボリック・リンクだった場合、オープンは失敗する。
O_NONBLOCK または O_NDELAY
可能ならば、ファイルは非停止 (nonblocking) モードでオープンされる。
O_SYNC
同期 I/O でのファイル完全性完了を提供
####すべてのフラグ
*印のあるものは作成フラグ。
それ以外は状態フラグ(fcntlにより変更できる)。
O_APPEND
O_ASYNC
- O_CLOEXEC (Linux 2.6.23 以降)
- O_CREAT
O_DIRECT (Linux 2.4.10 以降) - O_DIRECTORY
O_DSYNC - O_EXCL
O_LARGEFILE
O_NOATIME (Linux 2.6.8 以降) - O_NOCTTY
- O_NOFOLLOW
O_NONBLOCK または O_NDELAY
O_PATH (Linux 2.6.39 以降)
O_SYNC - O_TMPFILE (Linux 3.11 以降)
O_TRUNC - O_TTY_INIT
###modeについて
引数mode用に定義済みのシンボル定数が用意されている。
GNU Cではこの数値はchmodコマンドで指定できる数値と変わらないようだ。
8進数4桁の数値を使って自分で定義してもいいかと思う。
ただし移植性を考えるならヘッダ内のシンボル定数を利用するべきだろう。
8進数リテラルを表現するため数値の先頭に0(ゼロ)がいる。
例:
00777 :所有者、所有グループ、その他のユーザーに実行権限。
04777 :SUIDを付加することを除き上と同じ。
###errnoについて
ここに列挙することはしない。
manページなどを参考のこと。
###用例
#define FILEPATH "hoge"
open(FILEPATH, O_WRONLY | O_CREAT | O_TRUNK, 0644);
open(FILEPATH, O_WRONLY | O_CREAT | O_APPEND, 0644);
###備考:
openしたファイルにできる操作は主にread(2)とwrite(2)。
どちらも低レベルな入出力。バッファリングされない。
I/Oバッファは必要に応じシステムに適した値を設定する必要がある。
注意点としてC言語標準ライブラリのfopenはバッファリングされるため、
open(2)とfopen(3)を混在させるとファイルの整合がおかしくなる恐れがある。
新しいファイル・ディスクリプタはopen(2)したプロセス固有のものになるが、
自身プロセスのコピーを作成した場合、つまりfork(2)した場合、共有される可能性がある。
よって、排他的にファイル操作できない恐れがある。
また、execve(2)しメモリにプログラムを割り当てた場合、
既定の動作ではファイルは開いたままになっている。
これはひとつのファイル・リソースへの出入り口が複数ある状態を生む恐れがある。
ファイルが新しく作成されると、
ファイルの属性、最終アクセス時刻、最終状態変更時刻、最終修正時刻 が現在時刻に設定される。
ファイル名はディレクトリがもっているので、
作成したファイルが格納されているディレクトリにも同様の影響を及ぼす。
NFS(Network File System)上ではうまく動作しないケースが多々あるので注意。
JM man manページ
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/open.2.html