日本-日本語

製品  >  ソフトウェア  >  OpenVMS  >  マニュアル

OpenVMS マニュアル


≫ 

OpenVMS V7.3-2
ライブラリ

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

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


目次 索引



複数のシステム間でソース・プログラムを移植する予定がある場合, HP C RTL を使用するための最後の準備作業の 1 つとして, HP C RTL と,C 言語の他のインプリメンテーションのランタイム・ライブラリの相違点を認識することが必要です。ここでは,OpenVMS システムとの間でプログラムを移植するときに発生する可能性のある問題の一部について説明します。移植性は HP C RTL のインプリメンテーションに密接に関係していますが,ここでは,他の HP C for OpenVMS 構造体の移植性についても説明します。

HP C RTL では, ANSI C で定義されているライブラリ関数をはじめ,一般に使用されている多くの API や,若干の OpenVMS 拡張機能も提供されます。特定の標準のうち, HP C RTL でインプリメントされている部分については, 第 1.5 節 を参照してください。可能な限り機能面で完全な移植性を維持するようになっています。 HP C RTL で提供される多くの標準 I/O および UNIX I/O の関数およびマクロは,他のインプリメンテーションの関数やマクロに機能的に対応します。

RTL 関数およびマクロの説明では,ここに示した問題の他に,ここに示していない問題についても詳しく説明しています。

次の一覧は,C プログラムを OpenVMS 環境に移植するときに考慮しなければならない問題点を示しています。

  • HP C for OpenVMS Systems はグローバル・シンボル endedataetextをインプリメントしていません。

  • OpenVMS システムと UNIX システムが仮想メモリをレイアウトする方法は異なっています。一部の UNIX システムでは,0 からブレーク・アドレスまでの間のアドレス空間はユーザ・プログラムでアクセスできます。 OpenVMS システムでは,メモリの最初のページにはアクセスできません。
    たとえば,プログラムで OpenVMS システムのロケーション 0 を参照しようとすると,ハードウェア・エラー (ACCVIO) が返され,プログラムは異常終了します。OpenVMS システムでは,ヌル・ポインタによって指されているロケーションへの参照など,不正なポインタ参照を検知するために,アドレス空間の最初のページが確保されています。この理由から,一部の UNIX システムで動作する既存のプログラムは,エラーになる可能性があり,必要に応じて変更する必要があります ( しかし,この点に関して Tru64 UNIX システムと OpenVMS システムは互換性があります )。

  • 一部の C プログラムでは, #includeファイルにすべての外部宣言が指定されることがあります。その後,初期化が必要な特定の宣言は関連モジュールで再び宣言されます。この方法でプログラミングした場合, HP C コンパイラは同じコンパイルで 2 回以上宣言された変数があることに関する警告メッセージを出力します。この警告を回避するための 1 つの方法として, #includeファイルで再宣言されるシンボルを extern変数に設定することができます。

  • OpenVMS VAX システムで, HP C は asm呼び出しをサポートしていません。 OpenVMS Alpha システムではこれらの呼び出しはサポートされます。組み込み関数の詳細については,『HP C User's Guide for OpenVMS Systems』を参照してください。

  • 一部の C プログラムでは,カウント付き文字列関数 strcmpnおよび strcpynが呼び出されます。これらの名前は HP C for OpenVMS Systems では使用されません。その代わり, strcmpnおよび strcpynの名前を,それに対応する ANSI 準拠の名前 strncmpおよび strncpyに拡張するマクロを定義することができます。

  • HP C for OpenVMS コンパイラでは,次の初期化形式はサポートされません。


    int  foo  123; 
    


    この初期化形式を使用するプログラムは変更する必要があります。

  • HP C for OpenVMS Systems では, __vax__alpha__32BITS__vms
    __vaxc__VMS_VER__DECC_VER__D_FLOAT__G_FLOAT__IEEE_FLOAT
    __X_FLOATなどの複数のコンパイル時マクロをあらかじめ定義しています。これらの定義済みマクロは,他のマシンやオペレーティング・システムと互換性を維持しなければならないプログラムにとって便利です。詳細については,『HP C User's Guide for OpenVMS Systems』の定義済みマクロの章を参照してください。

  • ANSI C 言語では,宣言で変数のメモリ順序が保証されません。次の例を参照してください。


    int  a, b, c; 
    

  • 要求される外部リンクのタイプに応じて,プログラム内の extern変数は, OpenVMS システムで HP C を使用する場合, UNIX システムの場合と異なる方法で取り扱われることがあります。詳細については,『HP C User's Guide for OpenVMS Systems』を参照してください。

  • ドル記号 ($) は, HP C for OpenVMS の識別子で使用できる文字であり,1 文字目として使用できます。

  • ANSI C 言語では,関数パラメータ・リストや他の多くの式で式の評価の順序を定義していません。各 C コンパイラで式を評価する方法は,その式が副作用を持つ場合にだけ重要です。次の例について考えてみましょう。


    a[i]  =  i++; 
    


    x = func_y() + func_z(); 
    


    f(p++, p++) 
    


    HP C でも他の C コンパイラでも,このような式がすべての C コンパイラで同じ順序で評価されるという保証はありません。

  • int型の HP C 変数のサイズは, OpenVMS システムでは 32 ビットです。他のマシン用に作成され, int型の変数のサイズが異なるサイズであると仮定されているプログラムは変更する必要があります。 long型の変数は, int型の変数と同じサイズ (32 ビット) です。

  • C 言語では,コンパイラが設計されたマシンに依存する構造体アライメントを定義しています。 OpenVMS VAX システムでは, HP C は, #pragma member_alignmentが指定されている場合を除き,構造体メンバをバイト境界に揃えます。 OpenVMS Alpha システムでは, #pragma nomember_alignmentが指定されている場合を除き, HP C は構造体メンバを自然境界に揃えます。他のインプリメンテーションでは,構造体メンバを異なる方法でアライメントすることがあります。

  • HP C での構造体メンバへの参照はあいまいにすることができません。詳細については,『HP C Language Reference Manual』を参照してください。

  • レジスタは変数が使用される頻度に応じて割り当てられますが, registerキーワードは,特定の変数をレジスタに格納するかどうかに関して強力なヒントをコンパイラに与えます。可能な場合は,変数はレジスタに格納されます。ストレージ・クラスが autoまたは registerのスカラ変数は,変数のアドレスがアンパサンド演算子 (&) で参照されることがなく,構造体やユニオンのメンバでない限り,レジスタに割り当てることができます。



1.9.1 リエントラント

HP C RTL では,リエントラントのサポートが向上し,強化されました。次の種類のリエントラントがサポートされます。

  • AST リエントラントでは,_BBSSI 組み込み関数を使用して, RTL コードのクリティカル・セクションの周囲で単純なロックを実行しますが,ロックされたコード領域で非同期システム・トラップ (AST) も必要になることがあります。この種のロックは,AST コードに HP C RTL I/O ルーチンへの呼び出しが含まれているときに使用しなければなりません。
    AST リエントラントを指定しないと,I/O ルーチンが異常終了することがあり, errnoが EALREADY に設定されます。

  • MULTITHREAD リエントラントは,DECthreads ライブラリを使用するプログラムなど,スレッド・プログラムで使用するように設計されています。このリエントラントは DECthreads ロックを使用し,AST を無効にしません。この形式のリエントラントを使用するには,システムで DECthreads が使用可能でなければなりません。

  • TOLERANT リエントラントでは,_BBSSI 組み込み関数を使用して, RTL コードのクリティカル・セクションの周囲で単純なロックを実行しますが, AST は禁止されません。この種のロックは,AST が使用され,ただちに配布しなければならないときに使用する必要があります。

  • NONE は HP C RTL で最適な性能を提供しますが, RTL コードのクリティカル・セクションの周囲で絶対にロックを行いません。実行スレッドが HP C RTL を呼び出す AST によって割り込まれる可能性がない場合は,シングル・スレッド環境でのみ使用するようにしなければなりません。

デフォルトのリエントラント・タイプは TOLERANT です。

リエントラント・タイプを設定するには, /REENTRANCY コマンド・ライン修飾子を指定してコンパイルするか, decc$set_reentrancy関数を呼び出します。 この関数は非 AST レベルから排他的に呼び出さなければなりません。

複数のスレッドまたは AST を使用するアプリケーションをプログラミングする場合は,次の 3 つのクラスの関数について考慮してください。

  • 内部データのない関数

  • スレッドだけで有効な内部データのある関数

  • プロセス単位の内部データがある関数

ほとんどの関数は,まったく内部データのない関数です。このような関数の場合,同期化が必要になるのは,パラメータがマルチスレッドのアプリケーションで使用されるか,または AST コンテキストと非 AST コンテキストの両方でパラメータが使用される場合だけです。たとえば, strcat関数は一般にはスレッド・セーフですが,次の例は安全でない使い方を示しています。


extern char buffer[100]; 
void routine1(char *data) { 
    strcat( buffer, data ); 
} 

routine1が複数のスレッドで並列に実行されるか,または routine1がそのルーチンを呼び出す AST ルーチンによって割り込まれると, strcat呼び出しの結果は予測不能になります。

2 番目のクラスの関数は,スレッドだけで有効な静的データを含む関数です。通常,これらの関数は,アプリケーションが文字列の格納領域を解放することを許可されていない状況で,文字列を返すライブラリ内のルーチンです。これらのルーチンはスレッド・セーフですが,AST リエントラントではありません。つまり,並列に呼び出しても安全ですが,各スレッドはそれぞれ独自のデータのコピーを保有します。同じルーチンが非 AST コンテキストで実行される可能性がある場合は,これらのルーチンを AST ルーチンから呼び出すことはできません。このクラスのルーチンは次のとおりです。


asctime        stat 
ctermid        strerror  
ctime          strtok 
cuserid        VAXC$ESTABLISH 
gmtime         the errno variable 
localtime      wcstok 
perror                

使用している TCP/IP 製品がスレッド・セーフの場合,すべてのソケット関数もこのリストに含まれます。

3 番目のクラスの関数は,プロセス単位のデータに影響する関数です。これらの関数はスレッド・セーフではなく,AST リエントラントでもありません。たとえば, sigsetmaskはプロセス単位のシグナル・マスクを確立します。次のようなルーチンについて考えてみましょう。


void update_data 
base() 
{ 
    int old_mask; 
 
    old_mask = sigsetmask( 1 << (SIGINT - 1)); 
        /* Do work here that should not be aborted. */ 
    sigsetmask( old_mask ); 
} 

update_databaseが複数のスレッドで並列して呼び出された場合,スレッド 2 が強制終了されない作業をまだ実行している間に,スレッド 1 は SIGINT のブロックを解除する可能性があります。

このクラスのルーチンは次のとおりです。

  • すべての signalルーチン

  • すべての execルーチン

  • exit_exitnicesystemwaitgetitimersetitimersetlocaleルーチン

注意

一般に, UTC ベースの時刻関数はメモリ内のタイム・ゾーン情報に影響を与える可能性があり,これはプロセス単位のデータです。しかし,アプリケーションが実行されている間,システム・タイム・ゾーンが変化せず ( これは一般的な場合です ),タイム・ゾーン・ファイルのキャッシュが許可されている場合 ( これはデフォルトです ),時刻関数 asctime_rctime_rgmtime_rlocaltime_r_rバリアントはスレッド・セーフであり,かつ AST リエントラントです。

しかし,アプリケーションの実行中にシステム・タイム・ゾーンが変化する可能性がある場合や,タイム・ゾーン・ファイルのキャッシュが許可されていない場合は, UTC ベースの時刻関数のバリアントはどちらも 3 番目のクラスの関数に属し,スレッド・セーフでも AST リエントラントでもありません。



同じアプリケーション内でマルチスレッド・プログラミング・モデルと OpenVMS AST プログラミング・モデルを混在させることは推奨できません。アプリケーションで,どのスレッドが AST によって割り込まれるかを制御することはできません。この結果,AST ルーチンからも必要とされるリソースをスレッドが保有している場合,リソースのデッドロックが発生します。次のルーチンはミューテックスを使用します。リソース・デッドロックの発生を回避するには,マルチスレッド・アプリケーションで AST ルーチンからこれらを呼び出さないようにしなければなりません。

  • すべての I/O ルーチン

  • すべてのソケット・ルーチン

  • すべてのシグナル・ルーチン

  • vforkexecwaitsystem

  • catgets

  • set_new_handler(C++ のみ)

  • getenv

  • randsrand

  • exit_exit

  • clock

  • nice

  • times

  • ctimelocaltimeasctimemktime



1.10 64 ビット・ポインタのサポート (Alpha only)

このセクションの説明は, OpenVMS Alpha バージョン 7.0 以降で 64 ビット仮想メモリ・アドレッシングを使用する必要のあるアプリケーション開発者を対象にしています。

OpenVMS Alpha の 64 ビット仮想アドレッシングのサポートでは, Alpha アーキテクチャで定義されている 64 ビット仮想アドレス空間が OpenVMS オペレーティング・システムとそのユーザの両方から使用できるようになっています。また,従来の 32 ビットの制限を超えて動的にマッピングされたデータにアクセスするために,プロセス単位の仮想アドレッシングも可能です。

OpenVMS Alpha バージョン 7.0 以降のシステムの HP C ランタイム・ライブラリでは, 64 ビット・ポインタをサポートするために次の機能が提供されます。

  • 既存のプログラムとの間で,バイナリ・レベルおよびソース・レベルの互換性が保証されます。

  • 64 ビットのサポート機能を活用するように変更されていないアプリケーションには影響を与えません。

  • 64 ビット・メモリを割り振るメモリ割り当てルーチンの機能が拡張されています。

  • 64 ビット・ポインタに対応するために,関数パラメータのサイズが拡大されました。

  • 呼び出し元が使用するポインタ・サイズに関する情報が必要な関数は,二重にインプリメントされています。

  • 適切なインプリメンテーションを呼び出すことができるように, DEC C バージョン 5.2 以降のコンパイラで新しい情報が提供されるようになりました。

  • ポインタ・サイズが混在するアプリケーションで,32 ビット形式と 64 ビット形式の関数を明示的に呼び出すことができる機能が提供されます。

  • 32 ビット・アプリケーションと 64 ビット・アプリケーションで使用するために, 1 つの共用可能イメージが提供されます。


目次 索引

印刷用画面へ
プライバシー 本サイト利用時の合意事項