プログラミングインタフェース

ファイルと入出力インタフェース

一連のデータとして構成されたファイルを「通常ファイル」と呼びます。通常ファイルには、ASCII テキスト、ほかの符号化バイナリデータによるテキスト、実行可能コード、またはテキスト、データ、コードの組み合わせが入っています。

通常ファイルの構成要素は次のとおりです。

Solaris オペレーティングシステムでは、次のような基本的なファイル入出力インタフェースが提供されています。

基本ファイル入出力

次のインタフェースは、ファイルとキャラクタ入出力デバイス上で基本的な操作を実行します。

表 4–1 基本的なファイル入出力インタフェース

インタフェース名 

目的 

open(2) 読み取りまたは書き込み用にファイルを開く
close(2) ファイル記述子を閉じる
read(2) ファイルから読み取る
write(2) ファイルに書き込む
creat(2) 新しいファイルを作成するか、既存のファイルに上書きする
unlink(2) ディレクトリエントリを削除する
lseek(2) 読み取りまたは書き込み用のファイルポインタを移動する

次のコード例は、基本的なファイル入出力インタフェースの使用方法を示します。read(2) と write(2) はどちらも、現在のファイルのオフセットから指定された数を超えないバイト数を転送し、実際に転送されたバイト数が返されます。read(2) では、ファイルの終わりは戻り値が 0 になります。


例 4–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 の使い方を示します。


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));

高度なファイル入出力

次の表に、高度なファイル入出力インタフェースが実行するタスクの一覧を示します。

表 4–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) ファイルへのシンボリックリンクを作成する

ファイルシステム制御

次の表にあるファイルシステム制御インタフェースを用いて、ファイルシステムに対してさまざまな制御を行うことができます。

表 4–3 ファイルシステム制御インタフェース

インタフェース名 

目的 

ustat(2) ファイルシステムの統計情報を取得する
sync(2) スーパーブロックを更新する
mount(2) ファイルシステムをマウントする
statvfs(2)、fstatvfs(2) ファイルシステム情報を取得する
sysfs(2) ファイルシステムの種類の情報を取得する