一連のデータとして構成されたファイルを「通常」ファイルと言います。このようなファイルには、ASCII テキスト、他の符号化バイナリデータによるテキスト、実行可能コード、またはテキスト、データ、コードの組み合わせが入っています。ファイルは、次の 2 つのコンポーネントに分かれています。
「i ノード」と呼ばれる制御データ。これらのデータには、ファイルタイプ、アクセス権、所有者、ファイルサイズ、データブロックの位置が含まれる。
ファイルの内容。区切れのないバイトのシーケンス。
Solaris は、次の 3 つの基本的なファイル入出力インタフェースを用意しています。
第 1 の形式は、伝統的な様式のファイル入出力。詳細は、「基本ファイル入出力」を参照してください。
第 2 の形式は、「標準のファイル入出力」。標準の入出力バッファリングによって、インタフェースが容易になり、仮想メモリのないシステム上で実行されるアプリケーションの効率を改善できます。Solaris 8 オペレーティング環境など、仮想メモリ環境で動作するアプリケーションの場合、標準のファイル入出力はきわめて効率の悪い形式です。
第 3 のファイル入出力形式は、「メモリ管理インタフェース」で説明するメモリマッピングインタフェースによって提供されます。マッピングファイルは、Solaris 8 環境で実行されるほとんどのアプリケーションに最も効率的で高性能のファイル入出力形式です。
表 5-1 に示している関数は、ファイルで基本操作を実行します。
表 5-1 基本的なファイル入出力関数
関数名 |
目的 |
---|---|
open(2) |
読み取りまたは書き込み用にファイルを開く。 |
close(2) |
ファイル記述子を閉じる。 |
read(2) |
ファイルから読み取る。 |
write(2) |
ファイルに書き込む。 |
creat(2) |
新しいファイルを作成するか、既存のファイルに上書きする。 |
unlink(2) |
ディレクトリエントリを削除する。 |
lseek(2) |
読み取り / 書き込み用のファイルポインタを移動する。 |
次のコード例は、基本的なファイル入出力インタフェースの使用方法を示します。read(2) と write(2) はどちらも、現在のファイルのオフセットから指定された数を超えないバイト数を転送します。実際に転送されたバイト数が戻されます。ファイルの終わりでは、read(2) の戻り値が 0 になります。
#include <fcntl.h> #define MAXSIZE 256 main() { int fd; ssize_t n; char array[MAXSIZE]; fd = open ("/etc/motd", O_RDONLY); if (fd == -1) { perror ("open"); exit (1); } while ((n = read (fd, array, MAXSIZE)) > 0) if (write (1, array, n) != n) perror ("write"); if (n == -1) perror ("read"); close (fd); } |
読み取りまたは書き込みを完了したら、必ずファイルを閉じて (close(2)) ください。開いて (open(2)) いないファイル記述子を閉じて (close(2)) はなりません。
開いているファイル内のオフセットは、read(2)、write(2)、または lseek(2) を呼び出すことによって変更されます。次に lseek(2) の使用例を示します。
off_t start, n; struct record rec; /* 現在のオフセットの位置をスタートにセットする */ start = lseek (fd, 0L, SEEK_CUR); /* スタートに戻る */ n = lseek (fd, -start, SEEK_SET); read (fd, &rec, sizeof (rec)); /* 前のレコードをリライトする */ n = lseek (fd, -sizeof (rec), SEEK_CUR); write (fd, (char *&rec, sizeof (rec)); |
高度なファイル入出力関数は、ディレクトリとファイルの作成と削除、既存のファイルへのリンクの作成、ファイル状態情報の取得または変更を行います。
表 5-2 高度なファイル入出力関数関数名 | 目的 |
---|---|
link(2) | ファイルにリンクする。 |
access(2) | ファイルのアクセス可能性を判定する。 |
mknod(2) | 特殊ファイルまたは通常のファイルを作成する。 |
chmod(2) | ファイルのモードを変更する。 |
chown(2), lchown (2), fchown(2) | ファイルの所有者とグループを変更する。 |
utime(2) | ファイルのアクセス時刻や変更時刻を設定する。 |
stat(2), lstat(2), fstat(2) | ファイルのステータスを取得する。 |
fcntl(2) | ファイル制御機能を実行する。 |
ioctl(2) | デバイスを制御する。 |
fpathconf(2) | 設定可能なパス名変数を取得する。 |
opendir(3C), readdir(3C), closedir(3C) | ディレクトリを操作する。 |
mkdir(2) | ディレクトリを作成する。 |
readlink(2) | シンボリックリンクの値を読みとる。 |
rename(2) | ファイル名を変更する。 |
rmdir(2) | ディレクトリを削除する。 |
symlink(2) | ファイルへのシンボリックリンクを作成する。 |
ファイルシステム制御関数を使用して、ファイルシステムを制御できます。
表 5-3 ファイルシステム情報を取得する。関数名 | 目的 |
---|---|
ustat(2) | ファイルシステムの統計情報を取得する。 |
sync(2) | スーパーブロッキングを更新する。 |
mount(2) | ファイルシステムをマウントする。 |
statvfs(2), fstatvfs(2) | ファイルシステム情報を取得する。 |
sysfs(2) | ファイルシステムの種類の情報を取得する。 |