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

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

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

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

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

基本ファイル入出力

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

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

インタフェース名 

目的 

open(2)

読み取りまたは書き込み用にファイルを開きます 

close(2)

ファイル記述子を閉じます 

read(2)

ファイルから読み取ります 

write(2)

ファイルに書き込みます 

creat(2)

新しいファイルを作成するか、既存のファイルに上書きします 

unlink(2)

ディレクトリエントリを削除します 

lseek(2)

読み取りまたは書き込み用のファイルポインタを移動します 

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


例 6–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) を呼び出してください。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 高度なファイル入出力インタフェース

インタフェース名 

目的 

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)

ファイルへのシンボリックリンクを作成します 

ファイルシステム制御

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

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

インタフェース名 

目的 

ustat(2)

ファイルシステムの統計情報を取得します 

sync(2)

スーパーブロックを更新します 

mount(2)

ファイルシステムをマウントします 

statvfs(2)fstatvfs(2)

ファイルシステム情報を取得します 

sysfs(2)

ファイルシステムの種類の情報を取得します