日本-日本語
日本HPホーム 製品 & サービス OpenVMS製品情報
≫  お問い合わせ


OpenVMS マニュアル


 

OpenVMS ドキュメント
ライブラリ

タイトルページ
目次
まえがき
第 1 章:はじめに
第 2 章:入出力について
第 3 章:文字/文字列/引数リスト関数
第 4 章:エラー処理とシグナル処理
第 5 章:サブプロセス関数
第 6 章:Curses画面管理関数とマクロ
第 7 章:算術関数
第 8 章:メモリ割り当て関数
第 9 章:システム関数
第 10 章:国際化ソフトウェアの開発
第 11 章:日付/時刻関数
第 12 章:シンボリックリンクとPOSIXパス名
付録 A:各OSバージョンでサポートする関数一覧
付録 B:非標準ヘッダに複製されているプロトタイプ
索引
PDF
OpenVMS ホーム

HP OpenVMS
HP C ランタイム・ライブラリ・リファレンス・マニュアル (上巻)


目次 索引

DECC$V62_RECORD_GENERATION を有効に設定すると,出力機能は OpenVMS Version 6.2 に対して使用される規則に従います。

DECC$WRITE_SHORT_RECORDS

DECC$WRITE_SHORT_RECORDS 機能論理名は,固定長ファイルへの従来のレコードの書き込み方式をデフォルトの動作として維持しながら, fwrite関数への以前の変更 (最大レコード・サイズより小さいサイズのレコード書き込みへの対応) をサポートしています。

DECC$WRITE_SHORT_RECORDS が有効の場合, EOF に書き込まれたショート・サイズ・レコード (サイズが最大レコード・サイズ未満のレコード) は,レコードをレコード境界に合わせるために,ゼロでパディングされます。これは,OpenVMS Version 7.3-1 と,この時期の一部の ACRTL ECO に見られる動作です。

DECC$WRITE_SHORT_RECORDS が無効の場合,パディングなしでレコードを書き込む従来の動作が実行されます。これが,推奨される,デフォルトの動作です。

DECC$XPG4_STRPTIME

XPG5 での strptimeのサポートでは,ピボット年のサポートが導入され, 0〜68 の年は 21 世紀,69〜99 の年は 20 世紀であると解釈されるようになりました。

DECC$XPG4_STRPTIME を有効に設定すると,XPG5 のピボット年のサポートは無効になり, 0〜99 のすべての年が現在の世紀であると解釈されます。

1.6 32 ビットの UID/GID と POSIX 形式の識別子

OpenVMS オペレーティング・システムのバージョンで POSIX 形式の識別子がサポートされる場合, POSIX 形式の識別子はユーザ識別子 (UID),グループ識別子 (GID),プロセス・グループを参照します。スコープには実識別子と実効識別子が含まれます。

HP C RTL で POSIX 形式の識別子をサポートするには, 32 ビットのユーザ ID とグループ ID のサポートが必要であり,サポートされるかどうかは,OpenVMS の基本バージョンの機能に応じて異なります。 POSIX 形式の ID は, OpenVMS Version 7.3-2 およびそれ以降でサポートされています。

POSIX 形式の識別子をサポートしているバージョンの OpenVMS でこの識別子を使用するには,アプリケーションが 32 ビット UID/GID 用にコンパイルされていなければなりません。 32 ビット UID/GID がデフォルトの OpenVMS バージョンでも,ユーザやアプリケーションは,DECC$POSIX_STYLE_UID 機能論理名を定義して, POSIX 形式の ID を有効にしなければなりません。

$ DEFINE DECC$POSIX_STYLE_UID ENABLE 

POSIX 形式の ID を有効にすると,コンパイル時に,個々の関数に対して,従来 (UIC ベース) の定義を呼び出すこともできます。この場合は, decc$が前についたエントリ・ポイント (POSIX 形式の動作を行う, decc$__long_gid_が前に付いたエントリ・ポイントではなく) を明示的に呼び出します。

POSIX 形式の ID を無効にするには,次の定義を行います。

$ DEFINE DECC$POSIX_STYLE_UID DISABLE 

OpenVMS Version 7.3-2 およびそれ以降では,POSIX 形式の ID と 32 ビットの UID/GID の両方がサポートされます。 32 ビットの UID/GID を使用するように設定してアプリケーションをコンパイルした場合, UID と GID はオペレーティング・システムの以前のバージョンと同様に UIC から取得されます。場合によっては, getgroups関数の場合のように,アプリケーションで 32 ビットの GID がサポートされる場合,より多くの情報が返されることがあります。

デフォルトで 32 ビットの UID/GID を使用するシステムで, 16 ビットの UID/GID をサポートするように設定したアプリケーションをコンパイルするには,マクロ _DECC_SHORT_GID_T に 1 を定義します。

1.7 OpenVMS システムでの入出力

HP C RTL とリンクする方法,および HP C 関数とマクロを呼び出す方法を学習したら,次に主要な目的である入出力 (I/O) のために HP C RTL を使用できるようになります。

システムごとに I/O の方法は異なっているため, OpenVMS 固有のファイル・アクセス方式を十分理解しておくことが必要です。十分理解しておけば,ソース・プログラムをあるオペレーティング・システムから別のオペレーティング・システムに移植するときに,機能上の相違点をあらかじめ予測することができます。

図 1-3 は, HP C RTL で使用できる I/O 方式を示しています。 OpenVMS システム・サービスは OpenVMS オペレーティング・システムと直接通信するため,オペレーティング・システムに最も近い位置にあります。 OpenVMS RMS (Record Management Services) 関数はシステム・サービスを使用し,それらのシステム・サービスがオペレーティング・システムを操作します。 HP C の標準 I/O および UNIX I/O 関数とマクロでは, RMS 関数を使用します。 HP C RTL 標準 I/O および UNIX I/O 関数およびマクロは,システムを操作するまでに複数の関数呼び出しのレイヤを通過しなければならないため,オペレーティング・システムから最も遠い位置にあります。

図 1-3 C プログラムからの I/O インタフェース


C プログラミング言語は UNIX オペレーティング・システムで開発されており,標準 I/O 関数は,ほとんどのアプリケーションで十分効率よく強力で便利な I/O 方式を提供できるように設計されており,さらに C 言語コンパイラが稼動するどのシステムでも関数を使用できるように,移植可能になるように設計されています。

HP C RTL では,このもともとの仕様にさらに機能が追加されています。 HP C RTL で実装されている標準 I/O 関数は,行区切り文字を認識するので, HP C RTL の標準 I/O 関数は特に,テキスト操作の場合に便利です。 HP C RTL では,一部の標準 I/O 関数はプリプロセッサ定義マクロとして実装されています。

同様に,UNIX の I/O 関数はもともと, UNIX オペレーティング・システムにより直接的にアクセス可能になるように設計されています。これらの関数では,数値のファイル記述子を使用してファイルを表現します。 UNIX システムでは,統一されたアクセス方式を可能にするために,すべての周辺デバイスがファイルとして表現されます。

HP C RTL では,もともとの仕様にさらに機能が追加されています。 HP C で実装されている UNIX I/O 関数は,特にバイナリ・データを操作するのに便利です。 HP C RTL ではまた,一部の I/O 関数はプリプロセッサ定義マクロとして実装されています。

HP C RTL には,すべての C コンパイラにある標準 I/O 関数が用意されており,その他にできるだけ多くの他の C の実装と互換性を維持するために UNIX I/O 関数も用意されています。しかし,標準 I/O と UNIX I/O のどちらも,ファイルにアクセスするために RMS を使用します。標準 I/O 関数と UNIX I/O 関数が RMS でフォーマットされたファイルを操作する方法を理解するには,RMS の基礎を学習する必要があります。 RMS ファイルに関連する標準 I/O と UNIX I/O の詳細については, 第 1.7.1 項 を参照してください。 RMS の概要については,『Guide to OpenVMS File Applications』を参照してください。

どの方法が適切であるかを判断する前に,まず,「UNIX との互換性が重要なのか, OpenVMS オペレーティング・システムのもとで単独に動作するコードを開発するのが重要なのか」という問題について検討してください。

  • UNIX との互換性が重要である場合は,最高レベルの I/O,つまり標準 I/O と UNIX I/O を使用することが必要でしょう。なぜなら,このレベルはオペレーティング・システムからの独立性がかなり高いからです。また,最高レベルの I/O は学習するのも簡単です。初心者のプログラマの場合,このことは重要な要素です。

  • UNIX との互換性が重要でない場合や,標準 I/O および UNIX I/O 方式で提供されない高度なファイル処理が必要な場合は, RMS を使用することが望ましいでしょう。

システム・レベルのソフトウェアを開発する場合,システム・サービスへの呼び出しを使用して OpenVMS オペレーティング・システムに直接アクセスしなければならないことがあります。たとえば,$QIO (Queue I/O Request) システム・サービスを通じて,直接ユーザ作成デバイス・ドライバにアクセスしなければならないことがあります。この場合は,OpenVMS レベルの I/O を使用します。経験の豊富な OpenVMS プログラマの場合は,このレベルを推奨します。 OpenVMS システム・サービスを呼び出すプログラムの例については,『HP C User's Guide for OpenVMS Systems』を参照してください。

おそらく, RMS や OpenVMS システム・サービスを使用しないこともあるでしょう。多くのアプリケーションでは,標準 I/O 関数と UNIX I/O 関数が十分効率的に機能します。 図 1-4 は,標準 I/O 関数および UNIX I/O 関数と RMS の依存関係を示しており,使用できるさまざまな I/O 方式も示しています。

図 1-4 標準 I/O および UNIX I/O と RMS の対応関係




標準 I/O および UNIX I/O の関数とマクロの機能および制約事項を理解するには, OpenVMS RMS (Record Management Services) について理解する必要があります。

RMS では次のファイル編成がサポートされます。

  • 順編成

  • 相対編成

  • 索引順編成

順編成ファイルにはレコードが連続的に記録され,レコードとレコードの間に空のレコードは存在しません。相対編成ファイルには固定長のセルが記録され,各セルにはレコードが格納されていることも,格納されていないこともあります。索引順編成ファイルには,データ,キャリッジ制御情報,さまざまなアクセス順序を可能にするキーを格納したレコードが記録されます。

HP C RTL の関数は順編成ファイルにだけアクセスできます。他のファイル編成を使用する場合は,RMS 関数を使用する必要があります。 RMS 関数の詳細については,『HP C User's Guide for OpenVMS Systems』を参照してください。

RMS はレコードの内容を考慮せず,レコードのフォーマットを考慮します。レコードのフォーマットとは,記憶媒体の記録面にレコードが物理的に記録される方法です。

RMS では次のレコード・フォーマットがサポートされます。

  • 固定長

  • 可変長

  • 固定長制御部付可変長 (VFC)

  • ストリーム

固定長レコード・フォーマットはファイルの作成時に指定できます。このフォーマットでは,すべてのレコードがファイル内で同じサイズの領域を使用します。ファイルの作成後にレコード・フォーマットを変更することはできません。

可変長,VFC,ストリーム・ファイル・フォーマットのレコードの長さは,最大サイズまでの範囲で変化することができ,最大サイズはファイルの作成時に指定しなければなりません。可変長レコードまたは VFC フォーマットのファイルでは,レコードのサイズはデータ・レコードの先頭にあるヘッダ・セクションに格納されます。ストリーム・ファイルでは,キャリッジ制御文字やライン・フィード文字など,特定の文字が検出されたときに,RMS はレコードを終了します。ストリーム・ファイルはテキストを格納するのに便利です。

RMS では,ファイル内のレコードのキャリッジ制御属性を指定できます。このような属性としては,暗黙のキャリッジ・リターンや Fortran でフォーマットされたレコードがあります。ファイルを端末やライン・プリンタ,他のデバイスに出力するときに, RMS はこれらのキャリッジ制御を解釈します。キャリッジ制御情報はデータ・レコードに格納されません。

デフォルト設定では,ファイルの前のバージョンが存在する場合,ファイルは RMS レコード・フォーマット,最大レコード・サイズ,レコード属性を前のバージョンから継承します。 OpenVMS システム・プログラマの場合,継承された属性は FAB$B_RFM,FAB$W_MRS,FAB$B_RAT と呼びます。前のバージョンが存在しない場合,新たに作成されたファイルのデフォルトはストリーム・フォーマットになり,レコードの終端はライン・フィード・レコード区切り文字および暗黙のキャリッジ・リターン属性で決定されます ( 本書では,この種のファイルをストリーム・ファイルと呼びます )。ストリーム・ファイルは, HP C RTL の標準 I/O および UNIX I/O 関数を使用して操作することができます。これらのファイルや,キャリッジ制御を含まない固定長レコード・ファイルを使用する場合, fseek関数や lseek関数を使用して,ファイルのランダムなバイトまでシークする機能に制限はありません。しかし,可変長レコード・フォーマットなど,ファイルに他の RMS レコード・フォーマットのいずれかが含まれる場合は, RMS の制限により,これらの関数はレコード境界までしかシークできません。他の VAX 言語やユーティリティで使用するファイルを作成またはアクセスしなければならない場合を除き,デフォルトの VAX ストリーム・フォーマットを使用してください。

1.7.2 RMS ファイルへのアクセス

RMS の順編成ファイルはレコード・モードまたはストリーム・モードでオープンすることができます。デフォルト設定では,STREAM_LF ファイルはストリーム・モードでオープンされます。他のすべてのファイル・タイプはレコード・モードでオープンされます。ファイルをオープンするときに,省略可能な引数 "ctx=rec" を指定することで,これらのデフォルト設定をレコード・モードに変更したり, "ctx=stm" を指定することでストリーム・モードに設定することができます。 RMS の相対編成ファイルと索引順編成ファイルは常にレコード・モードでオープンされます。アクセス・モードによって, HP C RTL でのさまざまな I/O 関数の動作が決定されます。

RMS で定義されているファイル・タイプの 1 つに, RMS-11 ストリーム・フォーマット・ファイルがあります。このファイル・タイプは,レコード・フォーマットの FAB$C_STM の値に対応します。このフォーマットは,SYS$GET が各レコードから先頭のヌル・バイトを削除する RMS レコード操作として定義されています。このファイル・タイプは HP C RTL によってレコード・モードで処理されるため,明示的に "ctx=stm" を指定してオープンしない限り,バイナリ・データのファイル・フォーマットとしては不適切です。 "ctx=stm" を指定した場合は,ファイルのデータ・バイトがそのまま返されます。

  注意
OpenVMS Version 7.0 で,ストリーム・ファイルの LRL のデフォルト値は 0 から 32767 に変更されました。この変更により,ソートなどの特定のファイル操作で性能が著しく低下しました。

しかし,この問題は回避することができます。 HP C RTL では,論理名 DECC$DEFAULT_LRL を定義することで,ストリーム・ファイルのレコード長のデフォルト値を変更できるようになりました。

HP C RTL は最初にこの論理名を検索します。この論理名が検索され,0〜32767 の範囲の数値に変換されると,その値がデフォルト LRL として使用されます。

OpenVMS Version 7.0 より前の動作に戻すには,次のコマンドを入力します。

$ DEFINE DECC$DEFAULT_LRL 0 



RMS ファイルへのストリーム・アクセスは, RMS のブロック I/O 機能を使用して実行されます。 RMS ファイルからのストリーム入力は,ディスクに格納されているファイルの各バイトをプログラムに渡すことにより実行されます。 RMS ファイルへのストリーム出力は,プログラムからファイルに各バイトを渡すことにより実行されます。 HP C RTL はデータに対して特殊な処理を何も実行しません。

ファイルをストリーム・モードでオープンすると, HP C RTL は大きな内部バッファ領域を割り当てます。データは単一読み込みを使用してファイルからバッファ領域に読み込まれ,必要に応じてプログラムに渡されます。内部バッファが満杯になるか,または fflush関数が呼び出されると,データはファイルに書き込まれます。

レコード・ファイルへのレコード・アクセスは, RMS のレコード I/O 機能を使用して実行されます。 HP C RTL は,レコードの読み込み処理と書き込み処理でキャリッジ制御文字を変換することにより,バイト・ストリームをエミュレートします。すべてのレコード・ファイルに対してランダム・アクセスが可能ですが, VFC ファイル,可変長レコード・ファイル,ヌル以外のキャリッジ制御付きファイルの場合,位置設定 ( fseekおよび lseek) はレコード境界で行う必要があります。レコード・ファイルの位置設定を行うと,バッファに格納されているすべての入力が破棄され,バッファに格納されている出力はファイルに書き込まれます。

RMS レコード・ファイルからのレコード入力は,次の 2 つのステップで HP C RTL によってエミュレートされます。

  1. HP C RTL はファイルから論理レコードを読み込みます。
    レコード・フォーマットが固定長制御部付可変長 (RFM = VFC) で,レコード属性がプリント・キャリッジ制御でない (RAT が PRN でない) 場合は, HP C RTL は固定長制御領域をレコードの先頭に結合します。

  2. HP C RTL はレコードのキャリッジ制御情報 (そのような情報がある場合) を変換することにより,レコードを拡張してバイト・ストリームをシミュレートします。

RMS の用語で表現すると, HP C RTL は次のいずれかの方法を使用して,レコードのキャリッジ制御情報を変換します。

  • レコード属性が暗黙のキャリッジ制御 (RAT = CR) の場合, HP C RTL は改行文字をレコードの末尾に追加します。
    この改行文字はレコードの一部であると解釈されます。したがって,たとえば fgetc関数を使用して取得することができ, fgets関数では行区切り文字として解釈されます。 fgetsは改行文字までファイルを読み込むため, RAT=CR のファイルの場合,この関数はレコード境界をまたがる文字列を検索することができません。

  • レコード属性がプリント・キャリッジ制御 (RAT = PRN) の場合は, HP C RTL はレコードを拡張し,レコードの前後にある先頭と末尾のキャリッジ制御を結合します。
    この変換は,RMS で指定されている規則に従って行われます。ただし,1 つの例外があります。接頭文字が x01 で接尾文字が x8D の場合,レコードの先頭には何も付加されず,レコードの末尾には 1 つの改行文字が付加されます。このような処理が行われるのは,この接頭文字/接尾文字の組み合わせが,通常は行を表現するために使用されるからです。

  • レコード属性が Fortran キャリッジ制御 (fRAT = FTN) の場合は, HP C RTL は最初の制御バイトを削除し, RMS の定義に従ってデータの前後に適切なキャリッジ制御文字を付加します。ただし,スペースおよびデフォルトのキャリッジ制御文字は例外です。これらの文字は行を表現するために使用されるので, HP C RTL はデータに 1 つの改行文字を付加します。
    Fortran キャリッジ制御のマッピングは, "ctx=nocvt" を使用することで無効に設定することができます。

  • レコード属性がヌル (RAT = NONE) で,入力が端末から取り込まれる場合は, HP C RTL は区切り文字をレコードに追加します。区切り文字がキャリッジ・リターンまたは Ctrl/Z の場合は, HP C はその文字を改行文字 (\n) に変換します。
    入力が端末以外のファイルから取り込まれる場合は, HP C RTL はレコードを変更せずにそのままプログラムに渡し,接頭文字や接尾文字は付加しません。

ファイルから読み込む場合, HP C RTL は変換から作成されたバイト・ストリームを渡します。 1 回の関数呼び出しで拡張されたレコードから読み込まれなかった情報は,次回の入力関数呼び出しで渡されます。

HP C RTL は RMS レコード・ファイルに対するレコード出力を次の 2 つのステップで実行します。


目次 索引

© 2012 Hewlett-Packard Development Company, L.P.