ファイルI/O

Stratus VOSでファイルI/Oを行うには次の手順でアクセスします。
1.ポート接続(s$attach_port)
2.オープン(s$open)
3.I/O(s$xxx_read,write)
4.クローズ(s$close)
5.ポート切断(s$detach_port)

この手順は、ファイルに限らず通信プログラムを書く場合も流れが同じです。まあ、プロトコルが違えばいろいろと設定が必要なので多様なルーチンコールが必要になりますけど。ポートを介してのアクセスという点からではこの流れという。

s$attach_portに指定する必須パラメータは、パス名のみ。パス名はシステムが認識するフルパス名(システム名、ディスク名、ファイルパスをすべて含む名前)を指定しなければ失敗します。よく使われるのは、s$expand_pathルーチンで相対パス名を指定してフルパス名を取得して与えるという感じです。ポート名はNULL文字列を指定すると、ランダムな名前を付けてくれるので、NULLでも問題ないです。まあ、プロダクツを作るなら名前を決めておくのが間違いないですし、誤って複数回attachさせてしまっても間違いに気づきやすいですので。戻される重要な値に、ポート番号があります。以後、ファイルアクセスには、割り当てられて戻されたポート番号を使います。(C言語でいうFILE*みたいなものです)

s$openでファイルをオープンしますが、既存のファイルを読み込みのみでオープンする場合は非常にパラメータがシンプルになります。書き込みや更新(読み書き)の場合は、ファイル属性やレコード長などのパラメータが必要です。あと難易度を高めてるパラメータにロッキングモードがあり、ファイルやレコード単位のロック機構を利用する場合、ファイルを利用するシステム全体で統一しなければなりません。ログみたいなファイルを読み込みモードかつロック無視なら、大半のパラメータは指定しても無視されるので、簡単にオープンできます。

ファイルI/Oはファイル属性やキー順ファイルなどによって異なります。s$rel_で始まるルーチンは固定・相対ファイルに使用し、s$keyed_で始まるルーチンはキー順ファイルに使用します。s$seq_で始まるルーチンはシーケンシャルファイルといった感じです。それと、ロッキング機能も併せてプログラミングしなければなりません。この辺りが一番の肝ですかね。

s$closeでファイルをクローズします。書き込みを行ってる場合は、最終的なフラッシュも行われます。ここで再度オープンすれば再度アクセスすることもできます。

s$detach_portでポートを切断します。この呼び出しで、ファイルを切り離しポートの接続情報をクリアします。