copy and destroy

catch and eat

open(2) / close(2)

日記の練習です。

『ふつうの Linux プログラミング』第5章「ストリームにかかわるシステムコール」の話

5.5 ファイルを開く

open(2)

#include <sys/typs.h>
#include <sys/stat.h>
#include <fcntl.h>

int open(const char *path, int flags);
int open(const char *path, int flags, mode_t mode);

open() は、第1引数 path のパスで示されるファイルにつながるストリームを作成し、そのストリームを指すファイルディスクリプタを返します。この処理をファイルを開く(open)と言います。

第2引数の flags はストリームの性質を表すフラグで、表5.2と表5.3に示す定数のビットごとの OR (論理和)を指定します。

表5.2

フラグ 意味
O_RDONLY 読み込み専用
O_WRONLY 書き込み専用
O_RDWR 読み書き両用

書き込み用のストリームを作る場合、 O_WRONLY または O_RDWR を使う場合には以下のフラグをあわせて使うと細かい挙動を指定できます。こちらのフラグは指定しなくても構いませんし、2つ以上を使うこともできます。

表5.3

フラグ 意味
O_CREAT ファイルが存在しなければ新しいファイルを作る
O_EXCL O_CREAT とともに指定すると、すでにファイルが存在するときはエラーになる
O_TRUNC O_CREAT とともに指定すると、ファイルが存在するときはまずファイルの長さをゼロにする
O_APPEND write() が常にファイル末尾に書き込むように指定する

O_EXCL フラグは、複数のプロセスが同時に同じパスにファイルを作ろうとしている可能性がある状況で有効です。このフラグを指定しておくと、ただ一つのプロセスだけがファイルを作ることができ、残りのプロセスではすべて open() が失敗します。

第3引数の mode は flags に O_CREAT フラグを指定したときだけ有効な引数です。ファイルを新しく作る場合に、そのファイルのパーミッションを指定します。ただし、ここで渡した値がそのまま使われるわけではなく、 umask という値が関わってきます。

close(2)

#include <unistd.h>

int close(int fd);

clese() は、ファイルディスクリプタ fd に関連付けられているストリームを始末します。この処理をファイルを閉じる(close)と言います。

問題なく閉じられたら 0 を返します。エラーが起きた場合には -1 を返します。

典型的な close() 呼び出しは次のようになるでしょう。

if (close(fd) < 0 ) {
    /* 何かしらのエラー処理 */
}

それから、

と、ここまで来ると、次は cat コマンドを作ることになります。もしかしたら写経は Cosense でする方が良いかも知れない。

powered by hatena blog.
the nikki system for lifelogging junkies.

all posts © their original owners.
writing is reusable solely under the by creative commons license.