一連のデータとして構成されたファイルを「通常ファイル」と呼びます。通常ファイルには、ASCII テキスト、ほかの符号化バイナリデータによるテキスト、実行可能コード、またはテキスト、データ、コードの組み合わせが入っています。
通常ファイルの構成要素は次のとおりです。
「i ノード」と呼ばれる制御データ。この制御データには、ファイルタイプ、アクセス権、所有者、ファイルサイズ、データブロックの位置が含まれる。
ファイルの内容。区切れのないバイトシーケンス。
Solaris オペレーティングシステムでは、次のような基本的なファイル入出力インタフェースが提供されています。
従来の raw スタイルのファイル入出力については、基本ファイル入出力を参照してください。
標準の入出力バッファリングによって、インタフェースが容易になり、仮想メモリーのないシステムで実行するアプリケーションの効率を改善できます。SunOS™ オペレーティングシステムのような仮想メモリー環境で動作しているアプリケーションでは、標準のファイル入出力は利用しなくなっています。
メモリーマッピングインタフェースについては、メモリー管理インタフェースを参照してください。マッピングファイルは、SunOS プラットフォームで動作するほとんどのアプリケーションに最も効率的なファイル入出力形式です。
次のインタフェースは、ファイルとキャラクタ入出力デバイス上で基本的な操作を実行します。
表 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 の使い方を示します。
off_t start, n; struct record rec; /* 現在のオフセットの位置をstart に設定する */ start = lseek (fd, 0L, SEEK_CUR); /* start に戻る */ 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) | ファイルシステムの種類の情報を取得する |