システムインタフェース

ファイルと入出力

一連のデータとして構成されたファイルを「通常」ファイルと言います。このようなファイルには、ASCII テキスト、他の符号化バイナリデータによるテキスト、実行可能コード、またはテキスト、データ、コードの組み合わせが入っています。ファイルは、次の 2 つのコンポーネントに分かれています。

Solaris は、次の 3 つの基本的なファイル入出力インタフェースを用意しています。

基本ファイル入出力

表 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 になります。


例 5-1


#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) ファイルシステムの種類の情報を取得する。