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


前へ 次へ 目次 索引


UNIX ファイル名変換の拡張

性能を改善するための各種の拡張 (特に,高速の UNIX 名変換による) には,以下のものがあります。

新しい関数と変更された関数

以下の新しい C RTL 関数が,OpenVMS バージョン 7.3-2 に用意されています。

ファイルの読み取り/書き込み関数


   pread         readv            __writev64 
   pwrite        _readv64          

プリント関数


   snprintf 
   vsnprintf 

シグナル関数


   sighold       sigignore        sigrelse       
   sigwait       sigtimedwait     sigwaitinfo        

時間関数


   nanosleep     clock_gettime 
   clock_getres  clock_settime 

パスワード関数


   getpwnam_r    _getpwnam_r64   __getpwnam64   _getpwent64 
   getpwuid      getpwuid_r      __getpwuid64   _getpwuid_r64 

セキュリティ/インパーソネーション関数


   endgrent      getgrnam        getsid        setpgrp 
   getgrent      getgrnam_r      seteuid       setregid 
   getgrgid      getpgid         setgrent      setreuid 
   getgrgid_r    getpgrp         setpgid       setsid 

ソケット関数


   poll 

その他の関数


   a64l       globfree    rand_r       decc$set_child_default_dir 
   glob       l64a        ttyname_r          

次の C RTL 関数は,変更されました。


   endpwent      setgid          geteuid 
   getegid       setpwent        getgid 
   getpwent      setuid          getuid 
   ttyname 


第 1 章
はじめに

ISO/ANSI C 標準では,ANSI C のインプリメンテーションで提供される関数,マクロ,関連する型を登録したライブラリを定義しています。『HP C Language Reference Manual』では,すべての HP C プラットフォームに共通の ANSI 準拠のライブラリの機能について説明しています。『HP C ランタイム・ライブラリ・リファレンス・マニュアル』では,これらのルーチンについてさらに詳しく説明し, OpenVMS 環境でこれらのルーチンを使用する方法についても説明します。また,OpenVMS システムで提供される追加のヘッダ・ファイル,関数,型,マクロについても説明します。

すべてのライブラリ関数はヘッダ・ファイルで宣言されます。ヘッダ・ファイルの内容をプログラムで使用できるようにするには, #includeプリプロセッサ・ディレクティブを使用してヘッダ・ファイルを取り込みます。次の例を参照してください。


    #include <stdlib.h>    

各ヘッダ・ファイルには,関連する関数の集合に対する関数プロトタイプが格納されており,これらの関数を使用するのに必要な型とマクロを定義しています。

OpenVMS Alpha システムでヘッダ・ファイルの一覧を表示するには,次のコマンドを使用します。


$ LIBRARY/LIST ALPHA$LIBRARY:SYS$STARLET_C.TLB 
 
$ LIBRARY/LIST ALPHA$LIBRARY:DECC$RTLDEF.TLB 
 
$ DIR SYS$COMMON:[DECC$LIB.REFERENCE.DECC$RTLDEF]*.H; 
 
$ DIR ALPHA$LIBRARY:*.H; 

最初のコマンドは,OpenVMS システム・インタフェースのヘッダ・ファイルのテキスト・モジュール形式を一覧表示します。 2 番目のコマンドは, HP C 言語インタフェースのヘッダ・ファイルのテキスト・モジュール形式を一覧表示します。 3 番目のコマンドは, HP C 言語イタンフェースの *.H ヘッダ・ファイルを一覧表示します。 4 番目のコマンドは,レイヤード・プロダクトおよび他のアプリケーションの *.H ヘッダ・ファイルを一覧表示します。

注意

SYS$COMMON:[DECC$LIB.REFERENCE.DECC$RTLDEF] ディレクトリは,表示のための単なる参照領域です。 #includeでファイルを検索する場合,コンパイラは *.TLB ファイルを確認します。

OpenVMS VAX システムでヘッダ・ファイルの一覧を表示するには,次のいずれかのコマンドを使用します。


$ DIR 'F$TRNLMN("DECC$LIBRARY_INCLUDE")'*.H;
$ DIR DECC$LIBRARY_INCLUDE:*.H;

OpenVMS VAX システムでは,次のコマンドは追加ヘッダ・ファイルや重複ヘッダ・ファイルも検索します。


$ DIR SYS$LIBRARY:*.H;

しかし, SYS$LIBRARY から検索される重複ファイル ( <stdio.h>など) は,おそらく VAX C バージョン 3.2 環境をサポートするものであり, HP C では使用されません。

関数定義自体がヘッダ・ファイルに含まれているわけではなく,これらの定義は OpenVMS オペレーティング・システムに付属している HP C Run-Time Library (RTL) に格納されています。 HP C RTL を使用する前に,次のことを十分理解しておく必要があります。

HP C RTL を効果的に使用するには,これらのすべてのトピックに関する知識が必要です。この章では,これらのトピックと HP C RTL との関連を示します。本書の他の章を読む前に,この章を必ずお読みください。

HP C RTL の基本的な目的は, C プログラムで I/O 操作を実行するための手段を提供することです。 C 言語自体には情報の読み書き機能はありません。 I/O のサポートの他に, HP C RTL では他の多くの作業を実行する手段も提供されます。

第 2 〜 11 章では, HP C RTL でサポートされるさまざまなタスクについて説明します。「リファレンス・セクション」では,これらのタスクを実行するために提供されるすべての関数とマクロをアルファベット順に示し,詳しく説明します。

1.1 HP C Run-Time Library の使用

HP C RTL を使用する場合,インプリメンテーション固有の特徴を理解しておく必要があります。

まず,C プログラムで HP C RTL の関数を使用する場合, mainという名前の関数,または main_programオプションを使用する関数がプログラム内に存在することを確認してください。詳細については,『HP C Language Reference Manual』または『HP C User's Guide for OpenVMS Systems』を参照してください。

次に, HP C RTL 関数は実行時に実行されますが,これらの関数に対する参照はリンク時に解決されます。プログラムをリンクすると,OpenVMS リンカは, LINK コマンド・ラインに指定された共用可能コード・ライブラリやオブジェクト・コード・ライブラリを検索することにより, HP C RTL 関数に対するすべての参照を解決します。

HP C RTL は共用可能イメージとして使用でき, HP C RTL オブジェクト・ライブラリを使用することもできます。

HP C RTL を共用可能イメージとして使用する場合, RTL のコードは SYS$SHARE 内のイメージ・ファイルに存在し,すべての HP C プログラムで共用されます。実行後,制御はユーザ・プログラムに返されます。このプロセスには次のような多くの利点があります。

HP C RTL にリンクする場合, LNK$LIBRARY 論理名を定義する必要はありません。実際には,共用可能イメージとのリンクの方が HP C RTL オブジェクト・ライブラリとのリンクより便利であるため, LNK$LIBRARY の割り当ては解除する必要があります。

HP C RTL とのリンクに関する補足情報については,OpenVMS, HP C ,HP C++ のリリース・ノートを参照してください。

1.2 Alpha システムでの RTL リンク・オプション (Alpha only)

ここでは,OpenVMS Alpha システムで HP C および HP C++ プログラムを HP C RTL とリンクする複数の方法について説明します。

1.2.1 共用可能イメージとのリンク

ほとんどのリンクでは,ALPHA$LIBRARY ディレクトリ内の HP C RTL 共用可能イメージ DECC$SHR.EXE を使用します。

共用可能イメージ VAXCRTL.EXE および VAXCRTLG.EXE は, OpenVMS Alpha システムにありません。唯一の C RTL 共用可能イメージは ALPHA$LIBRARY:DECC$SHR.EXE であり,リンカは IMAGELIB.OLB を通じて自動的にこのイメージを検索します。

VAXCRTL*.EXE は Alpha システムに存在しないため,次のことに注意する必要があります。

共用可能イメージに対してリンクするには,LINK コマンドを使用します。次の例を参照してください。


    $ LINK PROG1    

リンカは自動的に IMAGELIB.OLB から DECC$SHR.EXE を検索し,すべての C RTL 参照を解決します。

1.2.2 オブジェクト・ライブラリとのリンク

HP C RTL オブジェクト・ライブラリは, /PREFIX=ALL を使用せずにコンパイルされたプログラムをリンクする場合にだけ使用します。

OpenVMS Alpha システムでは, HP C RTL は ALPHA$LIBRARY ディレクトリに次のオブジェクト・ライブラリを提供します。

Curses 関数へのアクセスを可能にするオブジェクト・ライブラリ VAXCCURSE.OLB には,接頭語のないエントリ・ポイントが含まれており,これらのエントリ・ポイントは接頭語の付いた適切なエントリ・ポイントに変換されます。

オブジェクト・ライブラリ VAXCRTL.OLB,VAXCRTLD.OLB,VAXCRTLT.OLB, VAXCRTLX.OLB,VAXCRTLDX.OLB,VAXCRTLTX.OLB には,使用するオブジェクト・ライブラリに指定されている浮動小数点型に応じて,適切な接頭語の付いたエントリ・ポイントに変換される接頭語のないエントリ・ポイントも含まれています。

/L_DOUBLE_SIZE=128 がデフォルトです。

LINK コマンドには,VAXCRTL*.OLB ライブラリを 1 つだけ指定し,必要に応じて VAXCCURSE.OLB ライブラリも指定します。

コンパイラのデフォルト・モード (/STANDARD=RELAXED_ANSI89) および厳密な ANSI C モードでは, ANSI C 標準ライブラリ・ルーチンに対するすべての呼び出しに,接頭語 DECC$ が自動的に付加されます。 /[NO]PREFIX_LIBRARY_ENTRIES 修飾子を使用すると,この動作を変更して,すべての HP C RTL の名前に DECC$ という接頭語を付けるか, HP C RTL の名前に接頭語を付けないようにすることができます。この修飾子には他のオプションも用意されています。詳細については,この章の /[NO]PREFIX_LIBRARY_ENTRIES 修飾子の説明を参照してください。

/NOSYSSHR を使用してリンクするときに, HP C RTL ルーチンの呼び出しに DECC$ という接頭語を付ける場合,リンクが必要なのは STARLET.OLB 内のモジュールだけです。 STARLET.OLB はリンカで自動的に検索されるため ( リンク修飾子 /NOSYSLIB を使用しない限り ),接頭語の付いたすべての RTL 外部名は自動的に解決されます。

HP C RTL ルーチンの呼び出しに接頭語を付けない場合は,必要な浮動小数点型に応じて,あるいは Curses 関数が必要かどうかに応じて, VAXCRTL.OLB,VAXCRTLD.OLB,VAXCRTLT.OLB ( または VAXCRTLX.OLB,VAXCRTLDX.OLB,VAXCRTLDX.OLB), VAXCCURSE.OLB のいずれかに対して明示的にリンクする必要があります。 /NOSYSSHR を使用してリンクする場合は,接頭語の付いた HP C RTL エントリ・ポイントは STARLET.OLB で解決されます。 /SYSSHR (デフォルト) を使用してリンクする場合は,接頭語の付いた HP C RTL エントリ・ポイントは DECC$SHR.EXE で解決されます。

1.2.3 例

次の例では, HP C RTL とリンクするための複数の方法を示しています。 図 1-1 は,これらの例を図でわかりやすく示しています。

  1. ほとんどの場合,共用可能イメージに対するリンクだけが必要です。


    $ CC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
    $ LINK PROG1
    


    リンカは IMAGELIB.OLB から自動的に DECC$SHR.EXE を検索します。

  2. オブジェクト・ライブラリだけを使用する場合 ( たとえば,特権付きコードを作成するためや配布を簡単にするため ), LINK コマンドの /NOSYSSHR 修飾子を使用します。


    $ CC/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES PROG1
    $ LINK/NOSYSSHR PROG1
    


    ユーザ・プログラム内で接頭語の付いた RTL シンボル参照は,STARLET.OLB に含まれる HP C RTL オブジェクト・ライブラリで解決されます。

    注意

    • /NOSYSSHR 修飾子を使用して, HP C プログラムを HP C RTL オブジェクト・ライブラリに対してリンクする場合,未定義グローバルを含まずにすでにリンクされているアプリケーションでは, CMA$TIS シンボルの未定義グローバルが発生することがあります。これらの未定義グローバルを解決するには,次の行をリンク・オプション・ファイルに追加します。


          SYS$LIBRARY:STARLET.OLB/LIBRARY/INCLUDE=CMA$TIS    
      

    • /NOSYSSHR 修飾子を使用してリンクしたプログラムで,動的に起動されるイメージ内に常駐するルーチンを呼び出し,そのルーチンが異常終了状態を示す値を返した場合, errnoは ENOSYS に設定され, vaxc$errnoは C$_NOSYSSHR に設定されます。 C$_NOSYSSHR に対応するエラー・メッセージは "Linking /NOSYSSHR disables dynamic image activation" です。たとえば,ソケット・ルーチンを呼び出すプログラムを, /NOSYSSHR を使用してリンクすると,このような状況が発生します。

  3. 接頭語を付加しないように設定してコンパイルした場合, C RTL 関数の別のインプリメンテーションを提供するオブジェクト・ライブラリを使用するには, VAXC*.OLB オブジェクト・ライブラリを使用する必要があります。この場合,コンパイルとリンクは次のように行います。


    $ CC/NOPREFIX_LIBRARY_ENTRIES PROG1
    $ LINK PROG1, MYLIB/LIBRARY, ALPHA$LIBRARY:VAXCRTLX.OLB/LIBRARY
    


    ユーザ・プログラム内で接頭語のない HP C RTL シンボル参照は, MYLIB および VAXCRTL.OLB で解決されます。
    VAXCRTLX.OLB 内で接頭語の付いた HP C RTL シンボル参照は, IMAGELIB.OLB を通じて DECC$SHR.EXE で解決されます。
    この同じ例で,IEEE T-floating 倍精度浮動小数点をサポートするには,次のコンパイルおよびリンク・コマンドを使用します。


    $ CC/NOPREFIX_LIBRARY_ENTRIES/FLOAT=IEEE_FLOAT PROG1
    $ LINK PROG1, MYLIB/LIBRARY, ALPHA$LIBRARY:VAXCRTLTX.OLB/LIBRARY 
    

  4. 例 2 と例 3 を組み合わせて,オブジェクト・ライブラリ ( 特権付きコードを作成するためや配布を簡単にするため ) だけを使用し, C RTL 関数を提供するオブジェクト・ライブラリを使用しなければならないことがあります。この場合,コンパイルとリンクは次の方法で行います。


    $ CC/NOPREFIX_LIBRARY_ENTRIES PROG1
    $ LINK/NOSYSSHR PROG1, MYLIB/LIBRARY, ALPHA$LIBRARY:VAXCRTLX.OLB/LIBRARY
    


    VAXCRTL.OLB 内で接頭語の付いた HP C RTL シンボル参照は, STARLET.OLB で解決されます。

図 1-1 OpenVMS Alpha システムでの HP C RTL とのリンク



前へ 次へ 目次 索引