コールイン・インタフェース
InterSystems IRIS® は、C プログラムを使用して InterSystems IRIS コマンドの実行および ObjectScript 式の評価ができるコールイン・インタフェースを提供しています。
コールイン・インタフェースは、広範囲のアプリケーションで使用できます。例えば、コールイン・インタフェースを使用して、総合メニューや GUI から ObjectScript を使用可能にできます。ATM や研究機器など外部デバイスから情報を収集する場合、コールイン・インタフェースを使用して InterSystems IRIS データベースにデータを格納できます。現在 InterSystems IRIS は C と C++ プログラムのみをサポートしますが、プラットフォームの呼び出し標準を使用するあらゆる言語で、コールイン関数を呼び出すことができます。
コールイン関数の概要は、"コールイン関数の使用法" を参照してください。各コールイン関数の詳細な参考資料は、"コールイン関数リファレンス" を参照してください。
セットアップ
コールイン開発環境には、以下のオプションが含まれている必要があります。
-
開発インストール・パッケージ
システムに [開発] インストール・オプションによってインストールされたコンポーネントが含まれている必要があります。InterSystems IRIS の既存のインスタンスは、インストーラを再度実行することで更新できます。
-
Windows では、インストール中に [セットアップタイプ]: [開発] オプションを選択します。
-
UNIX® および関連オペレーティング・システムでは、インストール中に 1) Development - Install InterSystems IRIS server and all language bindings オプションを選択します ("インストール・ガイド" の "UNIX® および Linux" のセクションにある “InterSystems IRIS の標準インストール手順” を参照してください)。
-
%Service_CallIn サービス
InterSystems IRIS をセキュリティ・オプション 2 (通常) でインストールした場合、管理ポータルを開いて、System Administration > Security > Services に移動し、%Service_CallIn を選択して、[サービス有効] ボックスにチェックが付いていることを確認します。
InterSystems IRIS をセキュリティ・オプション 1 (最小) でインストールした場合、これには既にチェックが付いているはずです。
iris-callin.h ヘッダ・ファイル
iris-callin.h ヘッダ・ファイルは、これらの関数のプロトタイプを定義します。これにより C コンパイラは、これらの関数がプログラム内で呼び出されたときにパラメータ・データ型が有効であるかどうかをテストできます。このファイルを、C プログラムの #include 文のリストに追加できます。
#include "iris-callin.h"
iris-callin.h ファイルには、呼び出しで使用するパラメータ値の定義が含まれ、有効に活用可能な各種の #define が組み込まれています。このような定義には、オペレーティング・システム固有の値、エラー・コード、および InterSystems IRIS がどのように動作するかを決定する値があります。
分散ヘッダ・ファイル iris-callin.h を変換できます。ただし、iris-callin.h は変更されることがあります。変換されたバージョン・ファイルを生成する場合、あらゆる変更を追跡する必要があります。インターシステムズのサポート窓口は、サポートされていない言語に関するお問い合わせにはお答えできません。
返り値とエラー・コード
ほとんどのコールイン関数は、int 型の値を返します。返り値は 16 ビット整数の容量を超えません。この返り値は、IRIS_SUCCESS、InterSystems IRIS エラー、またはコールイン・インタフェース・エラーです。
エラーには、2 種類あります。
iris-callin.h は、すべてのシステム・エラーとインタフェース・エラーで使用する、IRIS_SUCCESS (0) や IRIS_FAILURE (-1) などの記号を定義します。コールイン関数 IrisErrxlate を呼び出すことにより、InterSystems IRIS エラー (正の整数) を変換できます。
8 ビットおよび Unicode 文字列の処理
文字列を操作する InterSystems コールイン関数には、8 ビット・バージョンと Unicode バージョンの両方があります。これらの関数は、処理する文字列のタイプを示すために接尾語を使用します。
最適なパフォーマンスのために、インストールした InterSystems IRIS のバージョン固有の文字列を使用してください。
8 ビットの文字列データ型
InterSystems IRIS は、ローカルの 8 ビット文字列エンコーディングを使用する以下のデータ型をサポートします。
タイプ定義は以下のとおりです。
#define IRIS_MAXSTRLEN 32767
typedef struct {
unsigned short len;
Callin_char_t str[IRIS_MAXSTRLEN];
} IRIS_ASTR, *IRIS_ASTRP;
IRIS_ASTR 構造体と IRIS_ASTRP 構造体には以下の 2 つの要素が含まれています。
IRIS_MAXSTRLEN は、受け取る、あるいは返される文字列の最大長です。パラメータ文字列は、IRIS_MAXSTRLEN の長さである必要はなく、プログラムにそれほど多くの領域を割り当てる必要もありません。
2 バイト Unicode データ型
InterSystems IRIS は、2 バイトの Unicode 文字を使用するプラットフォーム上で、以下の Unicode 関連データ型をサポートしています。
タイプ定義は以下のとおりです。
typedef struct {
unsigned short len;
unsigned short str[IRIS_MAXSTRLEN];
} IRISWSTR, *IRISWSTRP;
IRISWSTR 構造体と IRISWSTRP 構造体には以下の 2 つの要素が含まれています。
IRIS_MAXSTRLEN は、受け取る、あるいは返される文字列の最大長です。パラメータ文字列は、IRIS_MAXSTRLEN の長さである必要はなく、プログラムにそれほど多くの領域を割り当てる必要もありません。
InterSystems IRIS の Unicode 対応バージョンでは、データ型 IRIS_WSTRING もあります。これは、2 バイトのプラットフォーム上でネイティブな文字列型を表します。IrisType はこの型を返します。さらに、IrisConvert では、返り値のデータ型として IRIS_WSTRING を指定できます。この型が要求された場合、結果は IRISWSTR バッファ内の計算 Unicode 文字列として渡されます。
4 バイト Unicode データ型
InterSystems IRIS は、4 バイトの Unicode 文字を使用するプラットフォーム上で、以下の Unicode 関連データ型をサポートしています。
タイプ定義は以下のとおりです。
typedef struct {
unsigned int len;
wchar_t str[IRIS_MAXSTRLEN];
} IRISHSTR, *IRISHSTRP;
IRISHSTR 構造体と IRISHSTRP 構造体には以下の 2 つの要素が含まれています。
IRIS_MAXSTRLEN は、受け取る、あるいは返される文字列の最大長です。パラメータ文字列は、IRIS_MAXSTRLEN の長さである必要はなく、プログラムにそれほど多くの領域を割り当てる必要もありません。
InterSystems IRIS の Unicode 対応バージョンでは、データ型 IRIS_HSTRING もあります。これは、4 バイトのプラットフォーム上でネイティブな文字列型を表します。IrisType はこの型を返します。さらに、IrisConvert では、返り値のデータ型として IRIS_HSTRING を指定できます。この型が要求された場合、結果は IRISHSTR バッファ内の計算 Unicode 文字列として渡されます。
Unicode 対応の InterSystems IRIS では、2 バイトの文字のみを使用するため、これらの文字列は InterSystems IRIS での受信時に UTF-16 に変換され、InterSystems IRIS からの送信時に UTF-16 から 4 バイトの Unicode に変換されます。$W 関数ファミリ (例えば、$WASCII() や $WCHAR()) を InterSystems IRIS コードで使用して、これらの文字列を処理できます。
システム中立の記号定義
一部の関数では、8 ビット・システムまたは Unicode システムで実行されるかどうかによって、許容される入力と出力が異なります。“A” (ASCII) 関数の多くでは、IRISSTR、IRIS_STR、IRISSTRP、または IRIS_STRP の各型を受け入れるものとして引数が定義されています。“A”、“W”、および “H” のいずれも使用しない記号の定義は、記号 IRIS_UNICODE および IRIS_WCHART がコンパイル時に定義されるかどうかによって、8 ビット名または Unicode 名のいずれかと条件付きで関連付けることができます。この方法により、ローカルの 8 ビット・エンコーディングあるいは Unicode エンコーディングのいずれかで動作する中立なシンボルを持つソース・コードを記述できます。
以下の iris-callin.h からの引用は概念を示しています。
#if defined(IRIS_UNICODE) /* Unicode character strings */
#define IRISSTR IRISWSTR
#define IRIS_STR IRISWSTR
#define IRISSTRP IRISWSTRP
#define IRIS_STRP IRISWSTRP
#define IRIS_STRING IRIS_WSTRING
#elif defined(IRIS_WCHART) /* wchar_t character strings */
#define IRISSTR IRISHSTR
#define IRIS_STR IRISHSTR
#define IRISSTRP IRISHSTRP
#define IRIS_STRP IRISHSTRP
#define IRIS_STRING IRIS_HSTRING
#else /* 8-bit character strings */
#define IRISSTR IRIS_ASTR
#define IRIS_STR IRIS_ASTR
#define IRISSTRP IRIS_ASTRP
#define IRIS_STRP IRIS_ASTRP
#define IRIS_STRING IRIS_ASTRING
#endif
InterSystems セキュリティ関数の使用法
InterSystems IRIS パスワードを使用する作業のために、2 つの関数が提供されています。
-
IrisSecureStart — IrisStart に類似していますが、パスワード認証のために追加のパラメータが提供されます。IrisStart 関数は、今では非推奨となっています。使用すると、Username、Password、および ExeName に NULL を指定して IrisSecureStart を呼び出したかのように動作します。何らかの形式のパスワード認証を使用する必要がある場合、IrisStart は使用できません。
-
IrisChangePassword — この関数は、ユーザが InterSystems 認証を使用している場合にユーザのパスワードを変更します (LDAP/DELEGATED/Kerberos などに対しては有効ではありません)。コールイン・セッションが初期化される前に呼び出される必要があります。
ASCII "A"、Unicode "W"、および Unicode "H" の各インストール用に、IrisSecureStart 関数と IrisChangePassword 関数があります。これらの新しい関数では、渡されたパラメータをナロー化、ワイド化、またはそのまま使用し、それらを新規コールイン・データ領域に保管した上で、最終的に IrisStart エントリ・ポイントを呼び出します。
IrisStart と IrisSecureStart の pin パラメータおよび pout パラメータは、NULL として渡すことができます。NULL は、プラットフォーム既定の入力および出力デバイスを使用することを意味します。
マルチスレッドでのコールインの使用
InterSystems IRIS は、Windows および UNIX® の一部のバージョンで実行されているスレッド・プログラムでコールインが使用できるように機能拡張されています (一覧については、このリリース用のオンライン・ドキュメント "インターシステムズのサポート対象プラットフォーム" の “その他のサポート対象機能” を参照してください)。スレッド化されたアプリケーションは、libirisdbt.so または irisdbt.lib に対してリンクする必要があります。
1 つのプログラムで複数のスレッド (UNIX® 環境では pthreads) を生成でき、各スレッドでは IrisSecureStart を呼び出すことで InterSystems IRIS との独立した接続を確立できます。スレッドは、InterSystems IRIS に対する単一の接続を共有できません。InterSystems IRIS を使用する必要があるスレッドは、それぞれが IrisSecureStart を呼び出さなければなりません。スレッドがコールイン関数の使用を試みるときに、IrisSecureStart を呼び出していない場合は、IRIS_NOCON エラーが返されます。
ログインの一部としての認証情報を指定するために IrisSecureStart が使用されている場合、認証情報はスレッド間で共有されていないので、各スレッドは IrisSecureStart を呼び出して、接続のために適正なユーザ名/パスワードを提供しなければなりません。C コンパイラは (非スレッド化ビルドで直接メモリ参照を使用する) スレッド・ローカル・ストレージにアクセスするために追加のコードを生成する必要があるため、InterSystems IRIS でスレッドを使用すると、パフォーマンスが劣化します。
スレッドおよび UNIX® のシグナル処理
UNIX® では、InterSystems IRIS は多くのシグナルを使用します。InterSystems IRIS で使用するシグナルと同じシグナルをアプリケーションでも使用する場合は、InterSystems IRIS でこれらがどのように処理されるのかを認識しておく必要があります。すべてのシグナルには、OS で指定された既定のアクションがあります。アプリケーションでは、既定のアクションをそのまま実行できるほか、シグナルを処理または無視することもできます。シグナルを処理する場合は、そのシグナルをブロックするスレッドと受信するスレッドをアプリケーションで選択できます。シグナルの中には、ブロック、無視、処理のいずれも不可能なものがあります。多くのシグナルの既定のアクションはプロセスの停止なので、この既定のアクションをそのままにしておくことはできません。以下のシグナルは捕捉も無視もできず、これらのシグナルが発生すればプロセスが終了します。
シグナル |
処理 |
SIGKILL |
直ちにプロセスを終了します。 |
SIGSTOP |
後で再開できるようにプロセスを停止します。 |
アプリケーションでシグナルごとに確立するアクションはプロセス全体で有効です。シグナルを各スレッドに送信できるかどうかは、スレッドに固有です。各スレッドでは、他のスレッドとは無関係にシグナルの処理方法を指定できます。あるスレッドではすべてのシグナルをブロックし、別のスレッドではすべてのシグナルを受信できるといった指定が可能です。シグナルをスレッドに送信したときの動作は、そのシグナルに対してプロセス規模で設定した処理によって決まります。
シグナル処理
InterSystems IRIS は、アプリケーション・ハンドラとシグナル・マスクを保存し、適切な時点でこれらをリストアすることによって、シグナル処理をアプリケーションによる処理と統合しています。シグナルは、以下の方法で処理されます。
生成されたシグナル
InterSystems IRIS では、生成されるすべてのシグナルで使用するために独自のシグナル・ハンドラをインストールします。また、現在のアプリケーションのシグナル・ハンドラを保存します。生成されたシグナルをスレッドで捕捉すると、シグナル・ハンドラはそのスレッドを InterSystems IRIS から切断し、アプリケーションのシグナル処理関数が存在する場合はそれを呼び出して、pthread_exit を実行します。
シグナル・ハンドラはプロセス全体で有効なので、InterSystems IRIS に接続されていないスレッドもシグナル・ハンドラに記録されます。接続されていないスレッドを検出すると、InterSystems IRIS はアプリケーションのハンドラを呼び出し、pthread_exit を実行します。
同期シグナル
InterSystems IRIS は、すべての同期シグナルに対してシグナル・ハンドラを確立し、スレッドが InterSystems IRIS に接続されるたびにそのスレッドでのこれらのシグナルに対するブロックを解除します (詳細は “同期シグナル” を参照してください)。
非同期シグナル
InterSystems IRIS は、プロセスを終了するすべての非同期シグナルを処理します (詳細は “非同期シグナル” を参照してください)。
保存/リストア・ハンドラ
最初のスレッドがシステムに接続したとき、システムはそのシグナルの状態を保存します。最後のスレッドを切断するときには、処理したシグナルごとにそのシグナルの状態をリストアします。
スレッド・シグナル・マスクの保存/リストア
スレッド・シグナル・マスクは、接続時に保存され、スレッドの切断時にリストアされます。
同期シグナル
同期シグナル (SIGSEGV など) は、アプリケーション自体で生成されます。InterSystems IRIS は、すべての同期シグナルに対してシグナル・ハンドラを確立し、スレッドが InterSystems IRIS に接続されるたびにそのスレッドでのこれらのシグナルに対するブロックを解除します。
同期シグナルは、そのシグナルを生成したスレッドにより捕捉されます。アプリケーションで生成したシグナル (SIGSEGV など) のハンドラをそのアプリケーションで指定していない場合、またはスレッドでシグナルをブロックしている場合、OS はプロセス全体を停止します。シグナル・ハンドラに記録されたスレッドは、他のスレッドに影響を与えることなく、(pthread_exit により) 正常に終了できます。スレッドがハンドラから戻ろうとすると、OS はプロセス全体を停止します。以下のシグナルが発生するとスレッドが終了します。
シグナル |
処理 |
SIGABRT |
中止シグナルを処理します。 |
SIGBUS |
バスのエラー |
SIGEMT |
EMT 命令 |
SIGFPE |
浮動少数点の例外 |
SIGILL |
不正な命令 |
SIGSEGV |
アクセス違反 |
SIGSYS |
システム呼び出しへの不正な引数 |
SIGTRAP |
トレース・トラップ |
SIGXCPU |
CPU の時間制限を超えています (setrlimit)。 |
非同期シグナル
非同期シグナル (SIGALRM、SIGINT、SIGTERM など) はアプリケーション外部で生成されます。InterSystems IRIS は、プロセスを終了するすべての非同期シグナルを処理します。
非同期シグナルは、そのシグナルをブロックしていないスレッドであれば捕捉できます。使用するスレッドはシステム側で選択します。プロセスの終了を既定のアクションとするあらゆるシグナルは、それを受信できる 1 つ以上のスレッドで処理する必要があります。処理しない場合は、明確に無視する必要があります。
アプリケーションでは、処理するシグナルのシグナル・ハンドラを確立し、これらのシグナルをブロックしないスレッドを開始する必要があります。そのスレッドは、そのシグナルを受信して処理できる唯一のスレッドとなります。アプリケーションから IrisStart を最初に呼び出す前に、ハンドラとシグナル処理可能なスレッドの両方が存在している必要があります。IrisStart への最初の呼び出しで、プロセスを終了するすべての非同期シグナルに対して以下のアクションが実行されます。
-
InterSystems IRIS は、これらのシグナルのハンドラを探します。ハンドラが見つかると、InterSystems IRIS はそれをそのままにします。見つからない場合、InterSystems IRIS はシグナルを SIG_IGN (シグナルを無視) に設定します。
-
InterSystems IRIS は、シグナルにハンドラがあるかどうかに関係なく、接続しているスレッドでこれらのシグナルをすべてブロックします。したがって、シグナルにハンドラがある場合は、InterSystems IRIS に接続していないスレッドのみがそのシグナルを捕捉できます。
以下のシグナルはこのプロセスの影響を受けます。
シグナル |
処理 |
SIGALRM |
タイマ |
SIGCHLD |
スレッドでブロックされます。 |
SIGDANGER |
処理されない場合は無視します。 |
SIGHUP |
処理されない場合は無視します。 |
SIGINT |
処理されない場合は無視します。 |
SIGPIPE |
処理されない場合は無視します。 |
SIGQUIT |
処理されない場合は無視します。 |
SIGTERM |
SIGTERM が処理されない場合は InterSystems IRIS で処理します。SIGTERM シグナルを受信した InterSystems IRIS ハンドラはすべてのスレッドを切断し、新しい接続を許可しません。SIGTERM のハンドラはスタックされません。 |
SIGUSR1 |
プロセス間通信 |
SIGUSR2 |
プロセス間通信 |
SIGVTALRM |
仮想タイマ |
SIGXFSZ |
InterSystems IRIS 非同期スレッド停止 |
コールイン・プログラミングのヒント
このセクションは、以下のトピックで構成されています。
すべてのコールイン・プログラム用のヒント
外部プログラムは、InterSystems IRIS のデータ構造を破損しないように、特定の規則に従う必要があります。データ構造が破損すると、システムが停止する可能性があります。
-
開いているファイル数の制限
InterSystems IRIS で必要なデータベースや他のファイルを開くことができるように、プログラムで大量のファイルを開かないように注意する必要があります。通常、InterSystems IRIS は使用中の開いているファイルの割り当てを検索し、データベース用に一定のファイル数を確保し、それ以外を Open コマンドに割り当てます。割り当てによって異なりますが、InterSystems IRIS には、同時に開く InterSystems IRIS データベース・ファイルが 6 ~ 30 個、また、Open コマンドで開くファイルが 0 ~ 36 個あると考えられます。
-
コールイン・アプリケーションのディレクトリ名の最大文字列長
コールイン・アプリケーションを持つディレクトリには、232 文字未満のフル・パスが必要です。 例えば、アプリケーションが C:\IrisApps\Accounting\AccountsPayable\ ディレクトリにある場合、このディレクトリの文字数は 40 文字であるため有効です。
-
停止する前に、IrisStart の後に IrisEnd を呼び出す
IrisStart の呼び出しにより接続が確立した場合、接続完了後、IrisEnd を呼び出す必要があります。必要な数だけコールイン関数を呼び出すことが可能です。
接続が切断されている場合でも、IrisEnd を呼び出す必要があります。接続は、RESJOB パラメータを持つ IrisAbort を呼び出すことで切断できます。
IrisEnd は、別の IrisStart 呼び出しの準備に必要なクリーンアップ処理を実行します。(接続が切断された場合) IrisEnd を呼び出さずに再度 IrisStart を呼び出すと、IRIS_CONBROKEN コードが返されます。
-
終了する前に、ObjectScript の実行が完了するまで待機する
プログラムを終了する場合、ObjectScript があらゆる未処理の要求を完了していることを確認する必要があります。コールイン関数 IrisContext を使用して、ObjectScript 内にいるかどうかを判断します。この呼び出しは、終了ハンドラと Ctrl-C、あるいは Ctrl-Y ハンドラで特に重要です。IrisContext がゼロ以外の値を返す場合、IrisAbort を呼び出すことができます。
-
コールイン・セッションでのマージンの維持
コールイン・セッション内ではマージンの設定が可能ですが、そのマージン設定は現在のコマンド行の残りに対してのみ保持されます。プログラム (ダイレクト・モードと同様) に、以下の行が含まれる場合、
:Use 0:10 Write x
コマンド行の有効期間に対してマージン 10 が確立されます。
一部の呼び出しはコマンド行に影響を与え、それに伴ってマージンも影響を受けます。 これらは、関数の説明で "InterSystems IRIS にコールインする" という注釈が付いている呼び出しです。
-
IrisStart() を使用する場合はシグナル処理を実行しない
IrisStart によってさまざまなシグナルにハンドラが設定されるので、呼び出し元のアプリケーションで設定したシグナル・ハンドラとこれらのハンドラが競合する可能性があります。
Windows 用のヒント
これらのヒントは、Windows にのみ適用されます。
-
iris 共有ライブラリ (irisdb.dll) を使用してコールイン・アプリケーションを構築する際の制約
共有ライブラリ (irisdb.dll) を使用してコールイン・アプリケーションを構築する場合、グローバル・バッファ・プールが大きいと、コールインの初期化 (IrisStart 内) が失敗して下記のエラーが発生する可能性があります。
<InterSystems IRIS 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) などの特定のアドレス領域を要求する傾向があるので、仮想ストレージの下位アドレスにある数百メガバイトの連続メモリが分断されます。その結果、コールイン実行可能プログラムでは、InterSystems IRIS 共有メモリ・セグメントをマッピングする仮想メモリ領域が不足します。
UNIX® および Linux 用のヒント
これらのヒントは、UNIX® および Linux にのみ適用されます。
-
UNIX® 上では割り込みを無効にしない
UNIX® は割り込みを使用します。割り込みの受け渡しを妨げないでください。
-
予約済みのシグナルの使用を避ける
UNIX® では、InterSystems IRIS は多くのシグナルを使用します。可能であれば、InterSystems IRIS にリンクしたアプリケーション・プログラムでは、以下の予約済みシグナルの使用を避けてください。
SIGABRT |
SIGDANGER |
SIGILL |
SIGQUIT |
SIGTERM |
SIGVTALRM |
SIGALRM |
SIGEMT |
SIGINT |
SIGSTOP |
SIGTRAP |
SIGXCPU |
SIGBUS |
SIGFPE |
SIGKILL |
SIGSEGV |
SIGUSR1 |
SIGXFSZ |
SIGCHLD |
SIGHUP |
SIGPIPE |
SIGSYS |
SIGUSR2 |
|
アプリケーションでこれらのシグナルを使用する場合は、InterSystems IRIS でこれらがどのように処理されるのかを認識しておく必要があります。詳細は、"スレッドおよび UNIX® のシグナル処理" を参照してください。
UNIX® 上でのコールイン実行可能プログラムの許可の設定
InterSystems IRIS 実行可能プログラム、ファイル、および共有メモリやオペレーティング・システム・メッセージなどのリソースの所有者は、インストール時に選択されたユーザ (インストール所有者)、および既定名 irisusr (インストール時に別の名前を選択できます) を持つグループです。これらのファイルやリソースには、このユーザ ID を持つプロセス、またはこのグループに属するプロセスのみアクセスできます。それ以外の場合、InterSystems IRIS に接続しようとすると、接続の確立前に、オペレーティング・システムから保護エラー (通常、アクセス拒否) が表示されます。
コールイン・プログラムは、実効グループ ID が irisusr である場合にのみ実行できます。この条件を満たすには、以下の条件のうち 1 つを満たしている必要があります。