8.3.4 低水準インタフェースルーチン

低水準インタフェースルーチンとは、ユーザシステムの仕様に合わせたライブラリ関数を実現するために、ライブラリ関数から呼び出されるユーザ関数のことです。次の場合に作成する必要があります。

 

(1) 標準入出力やメモリ管理に関するライブラリ関数を使用する場合

(2) ライブラリ関数がリエントラントである必要がある場合

 

表 8.2にCライブラリ関数で使用している低水準インタフェースルーチンの一覧を示します。

表 8.2

低水準インタフェースルーチンの一覧

No.

名称 *1

機能

1

open

ファイルのオープン

2

close

ファイルのクローズ

3

read

ファイルからの読み込み

4

write

ファイルへの書き出し

5

lseek

ファイルの読み込み/書き出しの位置の設定

6

sbrk

メモリ領域の確保

7

errno_addr *2

errno アドレスの取得

8

wait_sem *2

セマフォの確保

9

signal_sem *2

セマフォの解放

注 1.

関数名open、close、read、write、lseek、sbrk、error_addr、wait_sem、signal_semは低水準インタフェースルーチンの予約済み識別子です。ユーザプログラム中では使用しないでください。

注 2.

リエントラントライブラリを使用する場合に必要です。

 

低水準インタフェースルーチンで必要な初期化は、プログラム起動時に行う必要があります。これは、ライブラリ初期設定処理_INITLIBの中の「_INIT_LOWLEVEL」という関数の中で行ってください。

以下、低水準入出力の基本的な考え方を説明したあと、各インタフェースルーチンの仕様を説明します。

(1)

入出力の考え方

標準入出力ライブラリでは、ファイルをFILE型のデータによって管理しますが、低水準インタフェースルーチンでは、実際のファイルと1対1に対応する正の整数を与え、これによって管理します。この整数をファイル番号といいます。

openルーチンでは、与えられたファイル名に対してファイル番号を与えます。openルーチンでは、この番号によってファイルの入出力ができるように、以下の情報を設定する必要があります。

-

ファイルのデバイスの種類(コンソール、プリンタ、ディスクファイル等)。
コンソールやプリンタ等の特殊なデバイスに対しては、特別なファイル名をシステムで決めておいてopenルーチンで判定する必要があります。

-

ファイルのバッファリングはバッファの位置、サイズ等の情報。

-

ディスクファイルは、ファイルの先頭から次に読み込み/書き出しを行う位置までのバイトオフセット。

openルーチンで設定した情報に基づいて、以後、入出力(read、writeルーチン)、読み込み/書き出し位置の設定(lseekルーチン)を行います。

closeルーチンでは、出力ファイルのバッファリングを行っている場合はバッファの内容を実際のファイルに書き出し、openルーチンで設定したデータの領域が再使用できるようにしてください。

(2)

低水準インタフェースルーチンの仕様

本項では低水準インタフェースルーチンを作成するための仕様を説明します。以下、各ルーチンごとに、ルーチンを呼び出す際のインタフェースとその動作および実現上の注意事項を示します。

各ルーチンのインタフェースは以下の形式で示します。なお、低水準インタフェースルーチンは必ず関数原型にしてください。またC++プログラム内で宣言する場合は「extern "C"」を付加してください。

 

凡例:

 

(ルーチン名)

[説明]

-

(ルーチンの機能概要を示します)

[リターン値]

正常: (正常に終了した場合のリターン値を示します)

異常: (エラーが生じた場合のリターン値を示します)

[引数]

(名前) (意味)

(インタフェースに示す引数名です) (引数として渡される値を示します)