EN JA
FUNOPEN(3)
FUNOPEN(3) FreeBSD Library Functions Manual FUNOPEN(3)

名称

funopen, fropen, fwopenストリームをオープンする

ライブラリ

Standard C Library (libc, -lc)

書式

#include < stdio.h>

FILE *
funopen( const void *cookie, int (*readfn)(void *, char *, int), int (*writefn)(void *, const char *, int), fpos_t (*seekfn)(void *, fpos_t, int), int (*closefn)(void *));

FILE *
fropen( void *cookie, int (*readfn)(void *, char *, int));

FILE *
fwopen( void *cookie, int (*writefn)(void *, const char *, int));

解説

funopen() 関数は、ストリームを最大 4 つの“I/O 関数”に関連付けます。 readfnwritefn のどちらかは必ず指定しなければなりません。それ以外の箇所には適当な型の NULL ポインタを与えることができます。これらの I/O 関数は、新しいストリームに対して読み込み、書き込み、シーク、クローズのために使用されます。

通常、関数を省略したということは、作成されたストリームに関連付けられた操作を実行すると失敗する、ということを意味しています。クローズ関数が省略されている場合は、ストリームをクローズするとバッファリングされている出力がフラッシュされ、成功して終了します。

readfn, writefn, seekfn, closefn の呼び出し規則は、それぞれ read(2), write(2), lseek(2), close(2) のものと同じですが、通常ファイル記述子引数が置かれる場所に、 funopen() に指定された cookie 引数が渡されるという違いがあります。

読み込みおよび書き込み I/O 関数は、 setvbuf(3) を呼び出すことによって、完全にバッファリングされたもしくは行単位でバッファリングされたストリームの基礎となるバッファを変更することが許可されています。バッファを完全に満たしたり完全に空にしたりすることまでは要求されません。しかし、バッファリングされていない状態からバッファリングされた状態に変更したり、行バッファのフラグの状態を変更したりすることは許可されていません。最近指定されたもの以外のバッファに対して読み込みや書き込みの呼び出しが発生するということに備えておく必要があります。

すべてのユーザ I/O 関数は、-1 を返すことでエラーを報告できます。さらに、エラーが発生した場合、すべての関数は外部変数 errno を適切に設定する必要があります。

closefn() でエラーが起これば、ストリームをオープンしたままにしません。

便宜を図るため、インクルードファイル < stdio.h> では、 funopen() を読み込みまたは書き込み関数だけを指定して呼び出すための、 fropen() マクロと fwopen() マクロが定義されています。

戻り値

成功して終了すると、 funopen() は FILE ポインタを返します。それ以外の場合では NULL が返され、グローバル変数 errno にエラーを示す値が設定されます。

エラー

[ EINVAL]
funopen() 関数が、読み込み関数または書き込み関数のどちらも指定されずに呼び出されました。 funopen() 関数は失敗した時にルーチン malloc(3) に記述されたエラーのいずれかを errno に設定します。

歴史

funopen() 関数は、 4.4BSD で登場しました。

バグ

funopen() 関数は、 BSD 以外のシステムには移植可能でないかもしれません。

funopen() インタフェースは、 fpos_t が整数のタイプであると誤って決め込みます。この問題の考察については fseek(3) を参照してください。

March 19, 2004 FreeBSD