一連のデータが編成されたファイルを「通常ファイル」と呼びます。通常ファイルには、ASCII テキスト、ほかの符号化バイナリデータによるテキスト、実行可能コード、またはテキスト、データ、コードの組み合わせが入っています。
通常ファイルの構成要素は次のとおりです。
「i ノード」と呼ばれる制御データ。この制御データには、ファイルタイプ、アクセス権、所有者、ファイルサイズ、データブロックの位置が含まれます。
ファイルの内容。 区切れのないバイトシーケンス。
Solaris オペレーティングシステムでは、次のような基本的なファイル入出力インタフェースが提供されています。
従来の raw スタイルのファイル入出力については、「基本ファイル入出力」 を参照してください。
標準の入出力バッファリングによって、インタフェースが容易になり、仮想メモリーのないシステムで実行するアプリケーションの効率を改善できます。SunOS オペレーティングシステムのような仮想メモリー環境で動作しているアプリケーションでは、標準のファイル入出力は利用しなくなっています。
メモリーマッピングインタフェースについては、「メモリー管理インタフェース」 を参照してください。マッピングファイルは、SunOS プラットフォームで動作するほとんどのアプリケーションにもっとも効率的なファイル入出力形式です。
次のインタフェースは、ファイルとキャラクタ入出力デバイス上で基本的な操作を実行します。
表 6–1 基本的なファイル入出力インタフェース
インタフェース名 |
目的 |
---|---|
読み取りまたは書き込み用にファイルを開きます |
|
ファイル記述子を閉じます |
|
ファイルから読み取ります |
|
ファイルに書き込みます |
|
新しいファイルを作成するか、既存のファイルに上書きします |
|
ディレクトリエントリを削除します |
|
読み取りまたは書き込み用のファイルポインタを移動します |
次のコード例は、基本的なファイル入出力インタフェースの使用方法を示します。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) を呼び出してください。close(2) の呼び出しが完了していないファイル記述子に対しては open(2) を呼び出してはなりません。
開いたファイルへのファイルポインタオフセットを変更するには、read(2) または write(2) を使用するか、lseek(2) を呼び出します。次の例では、lseek の使い方を示します。
off_t start, n; struct record rec; /* record current offset in start */ start = lseek (fd, 0L, SEEK_CUR); /* go back to start */ n = lseek (fd, -start, SEEK_SET); read (fd, &rec, sizeof (rec)); /* rewrite previous record */ n = lseek (fd, -sizeof (rec), SEEK_CUR); write (fd, (char *&rec, sizeof (rec));
次の表に、高度なファイル入出力インタフェースが実行するタスクの一覧を示します。
表 6–2 高度なファイル入出力インタフェース
インタフェース名 |
目的 |
---|---|
ファイルにリンクします |
|
ファイルのアクセス可能性を判断します |
|
特殊ファイルまたは通常のファイルを作成します |
|
ファイルのモードを変更します |
|
ファイルの所有者とグループを変更します |
|
ファイルのアクセス時刻や変更時刻を設定します |
|
ファイルの状態を取得します |
|
ファイル制御機能を実行します |
|
デバイスを制御します |
|
設定可能なパス名変数を取得します |
|
ディレクトリを操作します |
|
ディレクトリを作成します |
|
シンボリックリンクの値を読み取ります |
|
ファイル名を変更します |
|
ディレクトリを削除します |
|
ファイルへのシンボリックリンクを作成します |
次の表にあるファイルシステム制御インタフェースを用いて、ファイルシステムに対してさまざまな制御を行うことができます。
表 6–3 ファイルシステム制御インタフェース
インタフェース名 |
目的 |
---|---|
ファイルシステムの統計情報を取得します |
|
スーパーブロックを更新します |
|
ファイルシステムをマウントします |
|
ファイルシステム情報を取得します |
|
ファイルシステムの種類の情報を取得します |