Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

コールイン・インタフェース

Caché は、C プログラムを使用して Caché コマンドの実行および Caché 式の評価ができるコールイン・インタフェースを提供しています。この章では、このインタフェースについて説明します。以下のセクションが含まれます。

コールイン・インタフェースは、広範囲のアプリケーションで使用できます。例えば、コールイン・インタフェースを使用して、総合メニューや GUI から ObjectScript を使用可能にできます。ATM や研究機器など外部デバイスから情報を収集する場合、コールイン・インタフェースを使用して Caché データベースにデータを格納できます。現在 Caché は C と C++ プログラムのみをサポートしますが、プラットフォーム (OpenVMS、UNIX®、Windows) の呼び出し標準を使用するあらゆる言語で、コールイン関数を呼び出すことができます。

コールイン関数の概要は、"コールイン関数の使用法" を参照してください。各コールイン関数の詳細な参考資料は、"コールイン関数リファレンス" を参照してください。

callin.h ヘッダ・ファイル

callin.h ヘッダ・ファイルは、これらの関数のプロトタイプを定義します。これにより C コンパイラは、これらの関数がプログラム内で呼び出されたときにパラメータ・データ型が有効であるかどうかをテストできます。このファイルを、C プログラムの #include 文のリストに追加できます。

#include "callin.h"

callin.h ファイルには、呼び出しで使用するパラメータ値の定義が含まれ、有効に活用可能な各種の #define が組み込まれています。このような定義には、オペレーティング・システム固有の値、エラー・コード、および Caché がどのように動作するかを決定する値があります。

分散ヘッダ・ファイル callin.h を変換できます。しかし、callin.h は変更されることがあります。変換されたバージョン・ファイルを生成する場合、あらゆる変更を追跡する必要があります。インターシステムズのサポート窓口は、サポートされていない言語に関するお問い合わせにはお答えできません。

返り値とエラー・コード

ほとんどのコールイン関数は、int 型の値を返します。返り値は 16 ビット整数の容量を超えません。この返り値は、CACHE_SUCCESS、Caché エラー、またはコールイン・インタフェース・エラーです。

エラーには、2 種類あります。

  • Caché エラー — Caché エラーの返り値は正の整数です。

  • インタフェース・エラー — インタフェース・エラーの返り値は、0 あるいは負の整数です。

ccallin.h は、すべての Caché エラーとインタフェース・エラーで使用する、CACHE_SUCCESS (0) や CACHE_FAILURE (-1) などの記号を定義します。コールイン関数 CacheErrxlate を呼び出すことにより、Caché エラー (正の整数) を変換できます。

8 ビットおよび Unicode 文字列の処理

文字列を操作する Caché コールイン関数には、8 ビット・バージョンと Unicode バージョンの両方があります。これらの関数は、処理する文字列のタイプを示すために接尾語を使用します。

  • 接尾語 A の付いた名前、またはまったく接尾語の付かない名前 (例えば、CacheEvalA または CachePopStr など) は、ローカルの 8 ビットにエンコードされた文字列を操作するバージョンです。

  • 接尾語 W の付いた名前 (例えば、CacheEvalW または CachePopStrW など) は、2 バイトの Unicode 文字を使用するプラットフォーム上の Unicode 文字列用のバージョンです。

  • 接尾語 H の付いた名前 (例えば、CacheEvalH または CachePopStrH など) は、4 バイトの Unicode 文字を使用するプラットフォーム上の Unicode 文字列用のバージョンです。

最適なパフォーマンスのために、インストールした Caché のバージョン固有の文字列を使用してください。

8 ビットの文字列データ型

Caché は、ローカルの 8 ビット文字列エンコーディングを使用する以下のデータ型をサポートします。

  • CACHE_ASTR — 8 ビット文字の計算文字列

  • CACHE_ASTRP — 8 ビット計算文字列へのポインタ

タイプ定義は以下のとおりです。

#define CACHE_MAXSTRLEN 32767
typedef struct {
   unsigned short  len;
   Callin_char_t   str[CACHE_MAXSTRLEN];
} CACHE_ASTR, *CACHE_ASTRP;

CACHE_ASTR 構造体と CACHE_ASTRP 構造体には以下の 2 つの要素が含まれています。

  • len — 整数。入力として使われる場合、この要素は、値が str 要素で供給されている文字列の実際の長さを指定します。出力として使われる場合、この要素は、str 要素に対して許容される最大の長さを指定します。値が返され次第、str の実際の長さと置換されます。

  • str — 入力または出力文字列。

CACHE_MAXSTRLEN は、受け取る、あるいは返される文字列の最大長です。パラメータ文字列は、CACHE_MAXSTRLEN の長さである必要はなく、プログラムにそれほど多くの領域を割り当てる必要もありません。

2 バイト Unicode データ型

Caché は、2 バイトの Unicode 文字を使用するプラットフォーム上で、以下の Unicode 関連データ型をサポートしています。

  • CACHEWSTR — Unicode 計算文字列

  • CACHEWSTRP — Unicode 計算文字列へのポインタ

タイプ定義は以下のとおりです。

typedef struct { 
   unsigned short len; 
   unsigned short str[CACHE_MAXSTRLEN]; 
} CACHEWSTR, *CACHEWSTRP;

CACHEWSTR 構造体と CACHEWSTRP 構造体には以下の 2 つの要素が含まれています。

  • len — 整数。入力として使われる場合、この要素は、値が str 要素で供給されている文字列の実際の長さを指定します。出力として使われる場合、この要素は、str 要素に対して許容される最大の長さを指定します。値が返され次第、str の実際の長さと置換されます。

  • str — 入力または出力文字列。

CACHE_MAXSTRLEN は、受け取る、あるいは返される文字列の最大長です。パラメータ文字列は、CACHE_MAXSTRLEN の長さである必要はなく、プログラムにそれほど多くの領域を割り当てる必要もありません。

Caché の Unicode 対応バージョンでは、データ型 CACHE_WSTRING もあります。これは、2 バイトのプラットフォーム上でネイティブな文字列型を表します。CacheType はこの型を返します。さらに、CacheConvert では、返り値のデータ型として CACHE_WSTRING を指定できます。この型が要求された場合、結果は CACHEWSTR バッファ内の計算 Unicode 文字列として渡されます。

4 バイト Unicode データ型

Caché は、4 バイトの Unicode 文字を使用するプラットフォーム上で、以下の Unicode 関連データ型をサポートしています。

  • CACHEHSTR — 拡張 Unicode 計算文字列

  • CACHEHSTRP — 拡張 Unicode 計算文字列へのポインタ

タイプ定義は以下のとおりです。

typedef struct {
   unsigned int len;
   wchar_t str[CACHE_MAXSTRLEN];
} CACHEHSTR, *CACHEHSTRP;

CACHEHSTR 構造体と CACHEHSTRP 構造体には以下の 2 つの要素が含まれています。

  • len — 整数。入力として使われる場合、この要素は、値が str 要素で供給されている文字列の実際の長さを指定します。出力として使われる場合、この要素は、str 要素に対して許容される最大の長さを指定します。値が返され次第、str の実際の長さと置換されます。

  • str — 入力または出力文字列。

CACHE_MAXSTRLEN は、受け取る、あるいは返される文字列の最大長です。パラメータ文字列は、CACHE_MAXSTRLEN の長さである必要はなく、プログラムにそれほど多くの領域を割り当てる必要もありません。

Caché の Unicode 対応バージョンでは、データ型 CACHE_HSTRING もあります。これは、4 バイトのプラットフォーム上でネイティブな文字列型を表します。CacheType はこの型を返します。さらに、CacheConvert では、返り値のデータ型として CACHE_HSTRING を指定できます。この型が要求された場合、結果は CACHEHSTR バッファ内の計算 Unicode 文字列として渡されます。

システム中立の記号定義

一部の関数では、8 ビット・システムまたは Unicode システムで実行されるかどうかによって、許容される入力と出力が異なります。“A” (ASCII) 関数の多くでは、CACHESTRCACHE_STRCACHESTRP、または CACHE_STRP の各型を受け入れるものとして引数が定義されています。“A”、“W”、および “H” のいずれも使用しない記号の定義は、記号 CACHE_UNICODE および CACHE_WCHART がコンパイル時に定義されるかどうかによって、8 ビット名または Unicode 名のいずれかと条件付きで関連付けることができます。この方法により、ローカルの 8 ビット・エンコーディングあるいは Unicode エンコーディングのいずれかで動作する中立なシンボルを持つソース・コードを記述できます。

以下の callin.h からの引用は概念を示しています。

#if defined(CACHE_UNICODE) /* Unicode character strings */
#define   CACHESTR      CACHEWSTR
#define   CACHE_STR     CACHEWSTR
#define   CACHESTRP     CACHEWSTRP
#define   CACHE_STRP    CACHEWSTRP
#define   CACHE_STRING  CACHE_WSTRING

#elif defined(CACHE_WCHART)  /* wchar_t character strings */
#define   CACHESTR      CACHEHSTR
#define   CACHE_STR     CACHEHSTR
#define   CACHESTRP     CACHEHSTRP
#define   CACHE_STRP    CACHEHSTRP
#define   CACHE_STRING  CACHE_HSTRING

#else                  /* 8-bit character strings */
#define   CACHESTR      CACHE_ASTR
#define   CACHE_STR     CACHE_ASTR
#define   CACHESTRP     CACHE_ASTRP
#define   CACHE_STRP    CACHE_ASTRP
#define   CACHE_STRING  CACHE_ASTRING
#endif

Caché セキュリティ関数の使用

Caché パスワードを使用する作業のために、2 つの関数が提供されています。

  • CacheSecureStartCacheStart に類似していますが、パスワード認証のために追加のパラメータが提供されます。CacheStart 関数は、今では非推奨となっています。使用すると、Username、Password、および ExeName に NULL を指定して CacheSecureStart を呼び出したかのように動作します。ある形式のパスワード認証を使用する必要がある場合、CacheStart は使用できません。

  • CacheChangePassword — この関数は、ユーザが Caché を使用している場合にユーザのパスワードを変更します (LDAP/DELEGATED/Kerberos などに対しては有効ではありません)。コールイン・セッションが初期化される前に呼び出される必要があります。

ASCII "A"、Unicode "W"、および Unicode "H" の各インストール用に、CacheSecureStart 関数と CacheChangePassword 関数があります。これらの新しい関数では、渡されたパラメータをナロー化、ワイド化、またはそのまま使用し、それらを新規コールイン・データ領域に保管した上で、最終的に CacheStart エントリ・ポイントを呼び出します。

CacheStartCacheSecureStartpin パラメータおよび pout パラメータは、NULL として渡すことができます。NULL は、プラットフォーム既定の入力および出力デバイスを使用することを意味します。

マルチスレッドでのコールインの使用

Caché は、Windows および UNIX® の一部のバージョンで実行されているスレッド・プログラムでコールインが使用できるように機能拡張されています (一覧については、このリリース用のオンライン・ドキュメント "インターシステムズでサポートされるプラットフォームOpens in a new tab" の “その他のサポート対象機能” を参照してください)。1 つのプログラムで複数のスレッド (UNIX® 環境では pthreads) を生成でき、各スレッドでは CacheSecureStart を呼び出すことで Caché との独立した接続を確立できます。スレッドは、Caché に対する単一の接続を共有できません。Cache を使用する必要があるスレッドは、CacheSecureStart を呼び出さなければなりません。スレッドがコールイン関数の使用を試みるときに、CacheSecureStart を呼び出していない場合は、CACHE_NOCON エラーが返されます。

スレッド化されたアプリケーションは、cachet.o または共有ライブラリ cachet.so に対してリンクする必要があります。UNIX® と Linux では、リンクする代わりに共有ライブラリを動的にロードできます。Windows 上では、スレッド・ローカル・ストレージが実装されているため、cachet.dll ライブラリは動的にロードできません。Caché に接続しているすべてのスレッドが CacheEnd を呼び出して接続を切断するまでは、プログラムが終了しないようにする必要があります。CacheEnd による接続の切断に失敗すると、そのインスタンスが停止することがあります。この場合は再起動が必要です。

ログインの一部としての資格情報を指定するために CacheSecureStart が使用されている場合、資格情報はスレッド間で共有されていないので、各スレッドは CacheSecureStart を呼び出して、接続のために適正なユーザ名/パスワードを提供しなければなりません。C コンパイラは (非スレッド化ビルドで直接メモリ参照を使用する) スレッド・ローカル・ストレージにアクセスするために 追加のコードを生成する必要があるため、Caché でスレッドを使用すると、パフォーマンスが劣化します。

サンプル・プログラム sampcallint.c は、この機能がサポートされているすべてのプラットフォーム上で提供されています。vc8 プロジェクトおよび UNIX® Makefile には、関連プラットフォーム上でサンプルのスレッド・コールイン・アプリケーションを構築するための指示が含まれています。

スレッドおよび UNIX® のシグナル処理

UNIX® では、Caché は多くのシグナルを使用します。Caché で使用するシグナルと同じシグナルをアプリケーションでも使用する場合は、Caché でこれらがどのように処理されるのかを認識しておく必要があります。すべてのシグナルには、OS で指定された既定のアクションがあります。アプリケーションでは、既定のアクションをそのまま実行できるほか、シグナルを処理または無視することもできます。シグナルを処理する場合は、そのシグナルをブロックするスレッドと受信するスレッドをアプリケーションで選択できます。シグナルの中には、ブロック、無視、処理のいずれも不可能なものがあります。多くのシグナルの既定のアクションはプロセスの停止なので、この既定のアクションをそのままにしておくことはできません。以下のシグナルは捕捉も無視もできず、これらのシグナルが発生すればプロセスが終了します。

シグナル 処理
SIGKILL 直ちにプロセスを終了します。
SIGSTOP 後で再開できるようにプロセスを停止します。

アプリケーションでシグナルごとに確立するアクションはプロセス全体で有効です。シグナルを各スレッドに送信できるかどうかは、スレッドに固有です。各スレッドでは、他のスレッドとは無関係にシグナルの処理方法を指定できます。あるスレッドではすべてのシグナルをブロックし、別のスレッドではすべてのシグナルを受信できるといった指定が可能です。シグナルをスレッドに送信したときの動作は、そのシグナルに対してプロセス規模で設定した処理によって決まります。

Caché のシグナル処理

Caché は、アプリケーション・ハンドラとシグナル・マスクを保存し、適切な時点でこれらをリストアすることによって、シグナル処理をアプリケーションによる処理と統合しています。Caché では、次のようにシグナルを処理します。

生成されたシグナル

Caché では、生成されるすべてのシグナルで使用するために独自のシグナル・ハンドラをインストールします。また、現在のアプリケーションのシグナル・ハンドラを保存します。生成されたシグナルをスレッドで捕捉すると、Caché のシグナル・ハンドラはそのスレッドを Caché から切断し、アプリケーションのシグナル処理関数が存在する場合はそれを呼び出して、pthread_exit を実行します。

シグナル・ハンドラはプロセス全体で有効なので、Caché に接続されていないスレッドも Caché のシグナル・ハンドラに記録されます。 接続されていないスレッドを検出すると、Caché はアプリケーションのハンドラを呼び出し、pthread_exit を実行します。

同期シグナル

Caché は、すべての同期シグナルに対してシグナル・ハンドラを確立し、スレッドが Caché に接続されるたびにそのスレッドでのこれらのシグナルに対するブロックを解除します (詳細は “同期シグナル” を参照)。

非同期シグナル

Caché は、プロセスを終了するすべての非同期シグナルを処理します (詳細は “非同期シグナル” を参照)。

保存/リストア・ハンドラ

最初のスレッドがシステムに接続したとき、システムはそのシグナルの状態を保存します。最後のスレッドを切断するときには、処理したシグナルごとにそのシグナルの状態をリストアします。

スレッド・シグナル・マスクの保存/リストア

スレッド・シグナル・マスクは、接続時に保存され、スレッドの切断時にリストアされます。

同期シグナル

同期シグナル (SIGSEGV など) は、アプリケーション自体で生成されます。Caché は、すべての同期シグナルに対してシグナル・ハンドラを確立し、スレッドが Caché に接続されるたびにそのスレッドでのこれらのシグナルに対するブロックを解除します。

同期シグナルは、そのシグナルを生成したスレッドにより捕捉されます。アプリケーションで生成したシグナル (SIGSEGV など) のハンドラをそのアプリケーションで指定していない場合、またはスレッドでシグナルをブロックしている場合、OS はプロセス全体を停止します。シグナル・ハンドラに記録されたスレッドは、他のスレッドに影響を与えることなく、(pthread_exit により) 正常に終了できます。スレッドがハンドラから戻ろうとすると、OS はプロセス全体を停止します。以下のシグナルが発生するとスレッドが終了します。

シグナル 処理
SIGABRT 中止シグナルを処理します。
SIGBUS バスのエラー
SIGEMT EMT 命令
SIGFPE 浮動少数点の例外
SIGILL 不正な命令
SIGSEGV アクセス違反
SIGSYS システム呼び出しへの不正な引数
SIGTRAP トレース・トラップ
SIGXCPU CPU の時間制限を超えています (setrlimit)。

非同期シグナル

非同期シグナル (SIGALRMSIGINTSIGTERM など) はアプリケーション外部で生成されます。Caché は、プロセスを終了するすべての非同期シグナルを処理します。

非同期シグナルは、そのシグナルをブロックしていないスレッドであれば捕捉できます。使用するスレッドはシステム側で選択します。プロセスの終了を既定のアクションとするあらゆるシグナルは、それを受信できる 1 つ以上のスレッドで処理する必要があります。処理しない場合は、明確に無視する必要があります。

アプリケーションでは、処理するシグナルのシグナル・ハンドラを確立し、これらのシグナルをブロックしないスレッドを開始する必要があります。そのスレッドは、そのシグナルを受信して処理できる唯一のスレッドとなります。アプリケーションから CacheStart を最初に呼び出す前に、ハンドラとシグナル処理可能なスレッドの両方が存在している必要があります。CacheStart への最初の呼び出しで、プロセスを終了するすべての非同期シグナルに対して以下のアクションが実行されます。

  • Caché はこれらのシグナルのハンドラを探します。ハンドラが見つかると、Caché はそれをそのままにします。見つからない場合、Caché はシグナルを SIG_IGN (シグナルを無視) に設定します。

  • Caché は、シグナルにハンドラがあるかどうかに関係なく、接続しているスレッドでこれらのシグナルをすべてブロックします。したがって、シグナルにハンドラがある場合は、Caché に接続していないスレッドのみがそのシグナルを捕捉できます。

以下のシグナルはこのプロセスの影響を受けます。

シグナル 処理
SIGALRM タイマ
SIGCHLD スレッドでブロックされます。
SIGDANGER 処理されない場合は無視します。
SIGHUP 処理されない場合は無視します。
SIGINT 処理されない場合は無視します。
SIGPIPE 処理されない場合は無視します。
SIGQUIT 処理されない場合は無視します。
SIGTERM SIGTERM が処理されない場合は Cache で処理します。SIGTERM シグナルを受信した Cache ハンドラはすべてのスレッドを切断し、新しい接続を許可しません。SIGTERM のハンドラはスタックされません。
SIGUSR1 プロセス間通信
SIGUSR2 プロセス間通信
SIGVTALRM 仮想タイマ
SIGXFSZ Caché 非同期スレッド停止

コールイン・プログラミングのヒント

このセクションは、以下のトピックで構成されています。

すべてのコールイン・プログラム用のヒント

外部プログラムは、Caché のデータ構造を破損しないように、特定の規則に従う必要があります。データ構造が破損すると、システムが停止する可能性があります。

  • 開いているファイル数の制限

    Caché で必要なデータベースや他のファイルを開くことができるように、プログラムで大量のファイルを開かないように注意する必要があります。通常、Caché は使用中の開いているファイルの割り当てを検索し、データベース用に一定のファイル数を確保し、それ以外を Open コマンドに割り当てます。割り当てによって異なりますが、Caché には、同時に開くデータベース・ファイルが 6 ~ 30 個、また、Open コマンドで開くファイルが 0 ~ 36 個あると考えられます。

  • コールイン・アプリケーションのディレクトリ名の最大文字列長

    コールイン・アプリケーションを持つディレクトリには、232 文字未満のフル・パスが必要です。 例えば、アプリケーションが C:\CacheApps\Accounting\AccountsPayable\ ディレクトリにある場合、このディレクトリの文字数は 40 文字であるため有効です。

  • 停止する前に、CacheStart の後に CacheEnd を呼び出す

    CacheStart の呼び出しにより Caché 接続が確立した場合、接続完了後、CacheEnd を呼び出す必要があります。必要な数だけコールイン関数を呼び出すことが可能です。

    接続が切断されている場合でも、CacheEnd を呼び出す必要があります。接続は、RESJOB パラメータを持つ CacheAbort を呼び出すことで切断できます。

    CacheEnd は、別の CacheStart 呼び出しの準備に必要なクリーンアップ処理を実行します。(接続が切断された場合) CacheEnd を呼び出さずに再度 CacheStart を呼び出すと、CACHE_CONBROKEN コードが返されます。

  • 終了する前に、ObjectScript の実行が完了するまで待機する

    プログラムを終了する場合、ObjectScript があらゆる未処理の要求を完了していることを確認する必要があります。コールイン関数 CacheContext を使用して、ObjectScript 内にいるかどうかを判断します。この呼び出しは、終了ハンドラと Ctrl-C、あるいは Ctrl-Y ハンドラで特に重要です。CacheContext がゼロ以外の値を返す場合、CacheAbort を呼び出すことができます。

  • コールイン・セッションでのマージンの維持

    コールイン・セッション内ではマージンの設定が可能ですが、そのマージン設定は現在のコマンド行の残りに対してのみ保持されます。プログラム (ダイレクト・モードと同様) に、以下の行が含まれる場合、

    :Use 0:10 Write x
    

    コマンド行の有効期間に対してマージン 10 が確立されます。

    一部の呼び出しはコマンド行に影響を与え、それに伴ってマージンも影響を受けます。 これらは、関数の説明で "Caché にコールインする" という注釈が付いている呼び出しです。

  • CacheStart() を使用する場合は、シグナル処理を実行しないでください。

    CacheStart によってさまざまなシグナルにハンドラが設定されるので、呼び出し元のアプリケーションで設定したシグナル・ハンドラとこれらのハンドラが競合する可能性があります。

Windows 用のヒント

これらのヒントは、Windows にのみ適用されます。

  • キャッシュ共有ライブラリ (cache.dll) を使用してコールイン・アプリケーションを構築する際の制約

    静的オブジェクト (cache.obj) ではなく、キャッシュ共有ライブラリ (cache.dll) を使用してコールイン・アプリケーションを構築する場合、グローバル・バッファ・プールが大きいと、コールインの初期化 (CacheStart 内) が失敗して下記のエラーが発生する可能性があります。

    <Cache Startup Error: Mapping shared memory (203)>

    この原因は、Windows でロードするシステム DLL の動作にあります。Win 32 API または Microsoft Foundation Class (Microsoft Visual C++ 開発をサポートする主要ライブラリ) を使用してコード作成したアプリケーションの場合、初期化した後、直ちにその Windows コード用の DLL を OS でロードする必要があります。これらの DLL は仮想ストレージの先頭 (上位アドレス) からロードされるので、ヒープとして利用できる領域が減少します。ほとんどのシステムでは、他の DLL (例えば、表示グラフィックをサポートする DLL など) も多数あり、Windows プロセスごとに、仮想ストレージのかなり上位のアドレスに自動的にロードされます。これらの DLL は、主に 0X10000000 (256 MB) などの特定のアドレス領域を要求する傾向があるので、仮想ストレージの下位アドレスにある数百メガバイトの連続メモリが分断されます。その結果、コールイン実行可能プログラムでは、キャッシュ共有メモリ・セグメントをマッピングする仮想メモリ領域が不足します。

UNIX®、Linux、および Mac OS 用のヒント

これらのヒントは、UNIX®、Linux および Mac OS にのみ適用されます。

  • UNIX® 上では割り込みを無効にしない

    UNIX® は割り込みを使用します。割り込みの受け渡しを妨げないでください。

  • 適切なバージョンの XCode を使用する

    2010.2 より前の Caché for Mac OS X (32 ビット) のバージョンは、Xcode 2.5 のコンパイラを使用して構築されていました。これらのバージョンの Caché コールイン・プログラムは、これと同一のコンパイラを使用して構築する必要があります。開発プラットフォームに Mac OS X 10.5 (Leopard) またはそれ以降を使用している場合、既定の Xcode 3.0 のコンパイラの代わりに Xcode 2.5 をロードして使用する必要があります。

  • 予約済みのシグナルの使用を避ける

    UNIX® では、Caché は多くのシグナルを使用します。可能であれば、Caché にリンクしたアプリケーション・プログラムでは、以下の予約済みシグナルの使用を避けてください。

    SIGABRT SIGDANGER SIGILL SIGQUIT SIGTERM SIGVTALRM
    SIGALRM SIGEMT SIGINT SIGSTOP SIGTRAP SIGXCPU
    SIGBUS SIGFPE SIGKILL SIGSEGV SIGUSR1 SIGXFSZ
    SIGCHLD SIGHUP SIGPIPE SIGSYS SIGUSR2  

    アプリケーションでこれらのシグナルを使用する場合は、Caché でこれらがどのように処理されるのかを認識しておく必要があります。詳細は、"スレッドおよび UNIX® のシグナル処理" を参照してください。

OpenVMS 用のヒント

これらのヒントは、OpenVMS にのみ適用されます。

  • OpenVMS 上でのコールインの終了

    OpenVMS STOP/ID コマンドを発行して、コールイン・プログラムを終了する場合、実害のないゴースト・プロセスが生じる場合があります。

    Caché のプロセスとしてプログラム実行中、OpenVMS が STOP/ID を受け取った場合、コマンドは無視され、ユーザはプロセスを削除できないというメッセージを受け取ります。

    しかし、STOP/ID を受け取る際、プログラムが Caché プロセスでない場合、このような保護機能はありません。このようなプロセスは即座に終了し、%SS でゴースト・プロセスのように表示されます。しかし、ゴースト・プロセスは、終了時に Caché リソースを占有しないため、システム停止の危険はありません。

  • OpenVMS へのイベント・フラグの割り当て

    OpenVMS は、特定のローカル・イベント・フラグ番号を予約します。同じイベント・フラグ番号を使用しないように、ご自身のプログラムでイベント・フラグ番号を返す LIB$GETEF 関数を使用し、番号を割り当てます。

  • 終了ハンドラは、OpenVMS に返す必要がある

    OpenVMS 環境では、終了ハンドラは、他の宣言済み終了ハンドラを完了させる必要があります。

  • AST の使用

    OpenVMS は、非同期システム・トラップ (AST) を使用します。AST の配布を妨げないでください。

Windows でのサンプル・プログラムの実行

\dev\cache\callin ディレクトリには、ソース・ファイル、ヘッダ・ファイル、および Caché コールイン・アプリケーションを構築するためのプロジェクト・ディレクトリが含まれています。これらのプロジェクトは、高レベルの Caché コールイン関数の使用法についての単純なデモを提供します。

これらのプロジェクトを構築するには、.vcproj ファイル ( Visual C++ 2005 の場合)、または .dsp ファイル ( Visual C++ 2003 の場合) のいずれかを開きます。ファイルをダブルクリックするか、または Visual C++ アプリケーションを実行し、[ファイル]→[開く]→[プロジェクト/ソリューション] を選択して、プロジェクト・ファイルを開きます。

Note:

コールイン・プログラムは、Windows 2000 でも実行できますが、そのコンパイルには Windows XP 以降のバージョンを使用する必要があります。これは、Visual Studio 2008 および Windows 2008 SDK が、Windows XP より前のバージョンの Windows をサポートしていないからです。Visual Studio 2008 の再配布版は Windows 2000 でサポートされていますが、Windows 2000 でサポートされている 互換性のあるコンパイラは存在しません。

shdir.c ファイルは、使用している Caché mgr ディレクトリへのパスで既に初期化されています。既定のインストールでは、shdir.c ファイルは、以下のようになります。

char shdir[256] = "c:\\cachesys\\mgr";

コールイン・インタフェースには、実行時にマネージャ・ディレクトリの名前を動的に設定するための CACHESETDIR エントリ・ポイントが用意されています。キャッシュの共有ライブラリ・バージョンで、インストールのマネージャのディレクトリを検索するためにこのインタフェースを使用する必要があります。

2 つのサンプル C プログラムが用意されています。sampcallin.c プログラムは、標準コールイン・アプリケーションの例であり、sampcallint.c は、スレッド・セーフ・コールイン・アプリケーションの例です。

sampcallin.c には 2 つのプロジェクトがあり、sampcallint.c には 1 つのプロジェクトがあります。これらのプロジェクトは、以下のとおりです。

  • callincache.obj を使用して、静的にリンクされたコールイン・アプリケーションを構築します。

  • callinshcache.dll.を使用して動的にリンクされたコールイン・アプリケーションを構築します。

  • callintcachet.dll.を使用して動的にリンクされたスレッド・セーフ・コールイン・アプリケーションを構築します。

各プロジェクトを構築したら、Visual C++ 環境で実行できます。

cache.dll を使用して、プロジェクトをキャッシュ共有ライブラリから構築する場合、このファイルが現在のディレクトリにある場合を除いて、cache.dll の場所をユーザの PATH 環境変数に定義する必要があります。

UNIX®および Linux でのサンプル・プログラムの実行

dev/cache/callin/samples ディレクトリには、コールインのサンプルを構築するための完全な Makefile が含まれています。これは、以前のリリースで使用されていた clink ファイルに代わるものです。

キャッシュの共有ライブラリ・バージョンが、現在、キャッシュ・オブジェクト・ファイルに加えて提供されています。UNIX® Makefile では、キャッシュ・オブジェクトを使用するコールイン・サンプル・アプリケーションと、libcache 共有ライブラリを使用するコールイン・サンプル・アプリケーションの 2 種類が構築されます。

dev/cache/callin/samples ディレクトリで make を実行します。提供された Makefile によって、czf インタフェースを使用するキャッシュ、標準コールイン・アプリケーション、および共有ライブラリ・コールイン・アプリケーションが構築されます。

編集の必要がないように、ファイル shdir.c はインストール中に適切な値に設定されます。

コールイン・インタフェースには、実行時にマネージャ・ディレクトリの名前を動的に設定するための CACHESETDIR エントリ・ポイントが用意されています。

UNIX® での Makefile の使用

コールイン・サンプルやカスタマ・コールイン・プログラムを構築するための UNIX® Makefile は、make コマンドで実行します。make は、現在のディレクトリから Makefile という名前のファイルを自動的に検索します。したがって、サンプル・ディレクトリで make を実行すると、サンプルのコールイン実行可能プログラムが生成されます。

make を呼び出すときにソース・プログラムの名前を指定するには、SRC 変数を使用します。 既定は sampcallin です。ビルドされるソース・ファイルの名前を変更するには、コマンド行で、SRC 変数をオーバーライドします。例えば、mycallin.c というコールイン・プログラムを使用している場合のコマンドは以下のようになります。

   make SRC=mycallin
UNIX® 上でのコールイン実行可能プログラムの許可の設定

Caché 実行可能プログラム、ファイル、および共有メモリやオペレーティング・システム・メッセージなどのリソースの所有者は、インストール時に選択されたユーザ (インストール所有者)、および既定名 cacheusr (インストール時に別の名前を選択できます) を持つグループです。これらのファイルやリソースには、このユーザ ID を持つプロセス、またはこのグループに属するプロセスのみアクセスできます。それ以外の場合、Caché に接続しようとすると、接続の確立前に、オペレーティング・システムから保護エラー (通常、アクセス拒否) が表示されます。

コールイン・プログラムは、実効グループ ID が cacheusr である場合にのみ実行できます。この条件を満たすには、以下の条件のうち 1 つを満たしている必要があります。

  • プログラムは cacheusr グループ (または、cacheusr からその他へ変更された場合は代替実行グループ) に属するユーザにより実行される。

  • プログラムでは、(UNIX® の chgrp コマンドと chmod コマンドを使用して) uid または gid のファイル・アクセス権を操作することにより、有効なユーザまたはグループを設定している。

OpenVMS でのサンプル・プログラムの実行

OpenVMS でコールイン・プログラムをコンパイル、リンク、実行するには、以下の手順に従います。

  1. Caché が実行中であることを確認します。この手順は、イメージ・ファイルにアクセスするために必要です。

  2. コマンドを入力して、プログラムをコンパイルします。

    $ CC MYCALLIN
    
    Note:

    OpenVMS 搭載の Alpha システムで IEEE 浮動小数点標準を使用するには、コンパイラ修飾子 /float=ieee_float を使用してコールイン実行可能プログラムをコンパイルします。(OpenVMS 搭載の Itanium システムでは、これが既定です)。

  3. sampcallin.c オブジェクトを、提供されたコールイン・ファイル CLINK.OPT にリンクします。詳細は、以下のセクションのいずれかを参照してください。

  4. 以下を入力し、実行可能プログラムを実行します。

    $ RUN MYCALLIN
    

OpenVMS の 32/64 ビット・ポインタ変換の問題のため、64 ビット・ポインタであるコンパイラ・オプション /pointersize=64 で Caché のコールイン・モジュールを構築してはいけません。既定の 32 ビット・ポインタを使用してください。

提供されるファイル

Caché コールイン・インタフェースに関する配布媒体のファイルには、以下が含まれています。

  • callin.h — コールイン・データ構造と関数のプロトタイプを伴うヘッダ・ファイル

  • sampcallin.c — コールイン・サンプル・ルーチン

  • CLINK.OPT — リンカ・オプションの指定

Alpha システム上での CLINK.OPT の使用

OpenVMS Alpha システム用の LINK コマンドで CLINK.OPT を使用します。CLINK.OPT は、以下の行を記述したリンカ・オプション・ファイルです。

CACHE.EXE/SHAREABLE
SYS$LIBRARY:VAXCTRL/LIBRARY

以下を入力して、sampcallin.c オブジェクトを CLINK.OPT にリンクします。

$ LINK MYCALLIN,CLINK/OPT,SYS$LIBRARY:VAXCRTL/LIB

または

$ LINK/EXE=MYCALLIN SYS$INPUT/OPTION MYCALLIN.OBJ 
    SYS$LIBRARY:VAXCRTL/LIB CACHESYS:CACHE/SHARE <CTRL-Z>

複数の Caché バージョンを同時にサポートするために、ユーザ定義のコールイン実行可能プログラムは、適切な CACHE.EXE の場所と対応する Caché マネージャ・ディレクトリの位置の両方を認識する必要があります。現在の構造では、実行可能プログラムはインストール・ディレクトリの bin サブディレクトリに位置し、マネージャ・ディレクトリは mgr サブディレクトリになります。

コールイン実行可能プログラムを適切にロードおよび実行するには、以下の 2 つの論理プロセスを定義します。

  • CACHECACHE.EXE ファイルの場所

  • CACHESYS — マネージャ・ディレクトリの場所

以下はその例です。

DEFINE CACHE DKA0:[CACHESYS.BIN]CACHE.EXE
DEFINE CACHESYS DKA0:[CACHESYS.MGR]

既定の構成の場合、あるいはマシンに初めてインストールする場合、ファイルを示すこのシステム論理名を使用できます。システム論理名 CACHESYS により、マネージャ・ディレクトリの場所が既に提供されているため、ユーザは、実行可能プログラムの場所のみを提供する必要があります。

DEFINE CACHE CACHEBIN:CACHE.EXE

CACHE 論理で指定されているのとは違う CACHE.EXE に対してリンクされているコールイン・プログラムを呼び出すと、予測できない結果を生じる可能性があります。

リンクするために CACHE.EXE の位置を指定するには、以下のオプションがあります。

  • 配布された CLINK.OPT ファイルを編集し、適切な CACHE.EXE の位置を指定します。

  • LINK コマンド用のコマンド行で位置を指定します。

以下の例は、CACHE.EXEDKA0:[CACHESYS.BIN] にあり、mycallin.c に呼び出されたユーザ・ソース・ファイルがあると仮定したものです。ソースをコンパイルするには以下のコマンドを使用します。

$ CC MYCALLIN

実行可能ファイルにリンクするには以下のコマンドを使用します。

$ LINK/EXECUTABLE=MYCALLIN MYCALLIN,  SYS$INPUT:/OPTIONS
DKA0:[CACHESYS.BIN]CACHE.EXE/SHAREABLE
SYS$LIBRARY:VAXCRTL/LIBRARY
<Ctrl-Z>

あるいは、読み取るために CLINK.OPT を編集します。

DKA0:[CACHESYS.BIN]CACHE.EXE/SHAREABLE
SYS$LIBRARY:VAXCRTL/LIBRARY

以下のように LINK を呼び出します。

$ LINK/EXECUTABLE=MYCALLIN MYCALLIN,  CLINK/OPTIONS

Itanium システム上での CLINK.OPT の使用

OpenVMS Itanium システム用の LINK コマンドで CLINK.OPT を使用します。CLINK.OPT は、以下の行を記述したリンカ・オプション・ファイルです。

CKERNEL.EXE/SHAREABLE

(CKERNEL.EXE は共有ライブラリ・イメージです。CACHE.EXE ファイルは、CKERNEL.EXE に対してリンクしたスタブを含む実行可能プログラム・イメージです。) 以下を入力して、sampcallin.c オブジェクトを CLINK.OPT にリンクします。

$ LINK MYCALLIN,CLINK/OPT

または

$ LINK/EXE=MYCALLIN SYS$INPUT/OPTION MYCALLIN.OBJ 
    CACHESYS:CKERNEL/SHARE <CTRL-Z>

複数の Caché バージョンを同時にサポートするために、ユーザ定義のコールイン実行可能プログラムは、適切な CKERNEL.EXE の場所および対応する Caché マネージャ・ディレクトリの場所の両方を認識する必要があります。現在の構造では、実行可能プログラムはインストール・ディレクトリの bin サブディレクトリに位置し、マネージャ・ディレクトリは mgr サブディレクトリになります。

コールイン実行可能プログラムを適切にロードおよび実行するには、以下の 2 つの論理プロセスを定義します。

  • CKERNELCKERNEL.EXE ファイルの場所

  • CACHESYS — マネージャ・ディレクトリの場所

以下はその例です。

DEFINE CKERNEL DKA0:[CACHESYS.BIN]CKERNEL.EXE
DEFINE CACHESYS DKA0:[CACHESYS.MGR]

既定の構成の場合、あるいはマシンに初めてインストールする場合、ファイルを示すこのシステム論理名を使用できます。システム論理名 CACHESYS により、マネージャ・ディレクトリの場所が既に提供されているため、ユーザは、実行可能プログラムの場所のみを提供する必要があります。

DEFINE CKERNEL CACHEBIN:CKERNEL.EXE

CKERNEL 論理で指定したものとは違う CKERNEL.EXE にリンクしたコールイン・プログラムを呼び出すと、予測できない結果を生じる可能性があります。

リンク対象の CKERNEL.EXE の位置を指定するには、以下のオプションがあります。

  • 配布された CLINK.OPT ファイルを編集し、適切な CKERNEL.EXE の位置を指定します。

  • LINK コマンド用のコマンド行で位置を指定します。

以下の例では、CKERNEL.EXEDKA0:[CACHESYS.BIN] にあり、mycallin.c というユーザ・ソース・ファイルが 1 つあると仮定しています。ソースをコンパイルするには以下のコマンドを使用します。

$ CC MYCALLIN

実行可能ファイルにリンクするには以下のコマンドを使用します。

$ LINK/EXECUTABLE=MYCALLIN MYCALLIN,  SYS$INPUT:/OPTIONS
DKA0:[CACHESYS.BIN]CKERNEL.EXE/SHAREABLE
<Ctrl-Z>

あるいは、読み取るために CLINK.OPT を編集します。

DKA0:[CACHESYS.BIN]CKERNEL.EXE/SHAREABLE

以下のように LINK を呼び出します。

$ LINK/EXECUTABLE=MYCALLIN MYCALLIN,  CLINK/OPTIONS

FeedbackOpens in a new tab