プロセスをバックグラウンドで実行します。
Synopsis
JOB:pc jobargument,...
J:pc jobargument,...
jobargument は以下のいずれかになります。
ローカル・ジョブ
routine(routine-params):(process-params):timeout
routine(routine-params)[joblocation]:(process-params):timeout
routine(routine-params)|joblocation|:(process-params):timeout
リモート・ジョブ
routine[joblocation]:(process-params)
routine|joblocation|:(process-params)
引数
pc オプション — 後置条件式。
routine JOB で作成されたプロセスによって実行されるルーチン。
routine—params オプション — ルーチンに渡されるパラメータの、コンマ区切りのリスト。このパラメータは、値、式、もしくは既存のローカル変数名です。指定された場合は、最後の括弧が必須です。ルーチン・パラメータは、ローカル・ジョブにのみ渡されます。
process—params オプション — コロンで区切られた位置パラメータのリスト。ジョブの環境内のさまざまな要素を設定するために使用されます。位置パラメータを指定しないことを示すには、コロンを記述する必要がありますが、末尾のコロンは省略できます。process—params リストは括弧で囲まれ、括弧で囲んだリストの前にコロンが付きます。
timeout オプション — ジョブ起動プロセスの開始を待つ秒数。最初のコロンは必須です。タイムアウトは、ローカル・ジョブに対してのみ指定できます。
joblocation オプション — リモート・ジョブを実行するシステム、またはディレクトリを指定するために使用される明示的なネームスペース、または暗黙のネームスペース。暗黙のネームスペースは、"^^dir" のように 2 つのキャレット文字が先頭にくるディレクトリ・パスあるいは OpenVMS ファイル仕様です。joblocation は、角括弧 ([ ])、または垂直バー ( | ) で囲まれます。joblocation がリモート・システムを指定する場合、routine-paramstimeout を指定することはできません。
概要
JOB は、ジョブジョブ起動プロセス、もしくはバッチ・ジョブと呼ばれる個別のプロセスを作成します。作成されたプロセスは、現在のプロセスと関係なく、バックグラウンドで実行されます。通常は、ユーザ対話も行いません。ジョブ起動プロセスは、JOB コマンドで明示的に指定されたものを除く、すべてのシステムの既定を継承します。
これに対し、DO コマンドで呼び出されたルーチンは、現在のプロセスの一部としてフォアグラウンドで実行されます。
JOB は使用中のローカル・システムに、ローカル・プロセスを作成するか、他のシステムでリモート・プロセスの作成を実行することもできます。リモート・ジョブに関する詳細は、"リモート・ジョブの開始" を参照してください。
引数
pc
オプションの後置条件式。Caché は、後置条件式が真 (0 以外の数値) の場合に JOB コマンドを実行します。Caché は、後置条件式が偽 (0) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。
routine
開始されるプロセス。以下の形式のいずれかで指定することができます。
プロセス仕様 概要
label 現在のルーチン内の行ラベルを指定します。
^routine ディスクに保存されているルーチンを指定します。Caché はディスクからそのルーチンをロードし、そのルーチン内の最初の実行可能行から実行を開始します。
label^routine ディスクに保存されている指定したルーチン内の行ラベルを指定します。Caché は、ディスクからそのルーチンをロードし、指定されたラベルから実行を続けます。
ラベルの指定された行のオフセットを指定します。オフセットを使用すると、プログラムのメンテナンスでの問題が生じることがあるので、お勧めしません。
routine—params
コンマで区切られた値のリスト、式、または既存のローカル変数名。括弧は必須です。このリストは、実パラメータ・リストと呼ばれます。ルーチンには、仮パラメータ・リストが必須です。また、このリスト内のパラメータ数は、実パラメータ・リスト内のパラメータ数以上でなければなりません。指定した実パラメータの方が多い場合、Caché は <PARAMPASS> エラーを返します。呼び出されるルーチンに仮パラメータ・リストが含まれている場合は、それを囲む括弧を指定する必要があります。パラメータを渡さない場合も同様です。
ルーチン・パラメータは値によってのみ渡すことができます。つまり、配列を渡すことはできないということです。この点で、値でも参照でもパラメータを渡すことができる DO コマンドとは異なります。この制限から、JOB コマンドでは配列を渡すことができません。配列は、参照でしか渡すことができないからです。
ルーチンを開始するとき、Caché はすべての式を評価し、実リスト内の各パラメータの値をその位置に従って、対応する仮リストの変数にマップします。仮リスト内の変数が、実リスト内のパラメータよりも多い場合は、余った変数は未定義のままになります。
ルーチン・パラメータは、ローカル・プロセスにのみ渡されます。リモート・ジョブを作成しているときは、ルーチン・パラメータを指定することはできません。詳細は、"リモート・ジョブの開始" を参照してください。
process—params
コロンで区切られた位置パラメータのリスト。ジョブの環境内のさまざまな要素を設定するために使用されます。先頭のコロンと括弧は必須です。process—params には、最大 4 つの位置パラメータを指定できます。その 4 つのパラメータは以下のとおりです。
(nspace:switch:principal-input:principal-output)
これらのパラメータの位置は決められているので、必ず示した順に指定してください。指定するパラメータの前に省略するパラメータがある場合は、プレースホルダとしてコロンを付ける必要があります。
以下の表は、4 つの位置パラメータの説明です。
パラメータ 概要
nspace プロセスの既定のネームスペース。指定された routine は、このネームスペースから引き出されます。nspace を省略した場合、現在の既定のネームスペースが、そのジョブ起動プロセスの既定のネームスペースになります。無効なネームスペースを指定した場合は、ジョブが開始されない可能性があります。リモート・ジョブは、プロセス・パラメータとしてネームスペースを指定できません。詳細は、"リモート・ジョブの開始" を参照してください。
switch
0、または複数の以下のフラグを示すビット・マスクとして表される整数である 2 つの値があります。
1 - 生成されたジョブにシンボル・テーブルを渡します。
2 - OpenVMS および UNIX : JOB サーバは使用しません。
4 - オープンされた TCP/IP ソケットを、生成されたジョブに渡します。
8 - 生成されたジョブの 2 桁の年に対する、プロセス独自のウィンドウがシステム全体の既定のスライディング・ウィンドウ定義になるように設定します。特に設定されない場合、生成されたジョブは、JOB コマンドを実行したプロセスのスライディング・ウィンドウ定義を継承します。
ジョブ起動子プロセスの、パーティション・サイズを指定する追加の数値。値の範囲は、32 の倍数で 128 (k) ~ 16384 (k) です。詳細は、"子プロセスのパーティション・サイズを指定する" を参照してください。
switch は、これらのマスクの組み合わせの合計を設定できます。例えば、switch 値 13 (1 + 4 + 8) はシンボル・テーブル (1) を渡し、オープンされた TCP/IP ソケット (4) を渡し、システム全体の既定である 2 桁の年 (8) のための、プロセス独自のウィンドウを設定します。
principal-input
プロセスの基本出力デバイス。
UNIX :既定は "principal-output" を参照。
VMS :既定は現在の入力デバイス。現在の入力デバイスが主デバイスである場合にログオフすると、ジョブ起動プロセスは新しいプロセスを開始するための JOB コマンドを実行できなくなります。
VMS : 主入力デバイス、および出力デバイスを指定しない場合、JOB コマンドでは、オープンするデバイスがわからない可能性があり、その結果プロセスは開始されません。このような状態を避けるには、常に基本入力デバイスおよび出力デバイスを指定します。入出力が必要ない場合は、NULL デバイス NL: を指定します。
principal-output
プロセスの基本出力デバイス。既定は、principal-input で指定したデバイスです。
UNIX: どちらのデバイスも指定していない場合、プロセスは、その JOB コマンドで開始されたプロセスの既定の主デバイス /dev/null を使用します。/dev/null の代わりに、主入力デバイスまたは出力デバイスを現在のデバイスの既定にするには、$ZUTIL(69,4) 関数を使用します。
VMS: どちらのデバイスも指定しない場合、プロセスは、現在の主入力デバイス、および出力デバイスを使用します。
VMS: ジョブ起動プロセスが、現在のデバイスを使用している場合は、ログオフすると、ジョブ起動プロセスは新しいプロセスを開始するための JOB コマンドを実行できなくなります。入出力が必要ない場合は、NULL デバイス NL: を指定します。
timeout
ジョブがタイムアウトし、中止される前に、ジョブ起動プロセスの開始を待機する秒数。最初のコロンは必須です。timeout は、整数値または式として指定する必要があります。ジョブ化したプロセスがタイムアウトになると、Caché はプロセスを中止し、$TEST を偽 (0) に設定します。実行は、呼び出しルーチンの次のコマンドから続行します。エラー・メッセージは発行されません。
タイムアウトは、ローカル・プロセスに対してのみ指定されます。
以下の例は、監視ルーチンをバックグラウンドで開始します。プロセスが 20 秒以内に開始されない場合、Caché は $TEST を偽 (0) に設定します。
   JOB ^monitor::20
   WRITE $TEST
以下の例は、Disp という名前の行ラベルで、監視ルーチンの実行を開始します。
   JOB Disp^monitor
以下の例は、ADD ルーチンを開始します。このとき、変数 num1 内の値、値 8、および式 a + 2 の結果の値がルーチンに渡されます。ADD ルーチンには、少なくとも 3 つのパラメータを含む、仮パラメータ・リストが含まれます。
   JOB ^Add(num1,8,a+2)
以下の例は、ADD ルーチンを開始します。このルーチンは仮パラメータ・リストを持っていますが、パラメータは渡されません。この場合、ADD ルーチンは、呼び出し元のルーチンから値を受け取らないので、その仮パラメータに既定値を割り当てるコードが含まれていなければなりません。
   JOB ^Add()
以下の例は、ラベル AA の現在のルーチンで実行するプロセスを作成します。プロセス・パラメータは、現在のシンボル・テーブルをルーチンに渡します。OpenVMS や UNIX で実行している場合、JOB サーバを使用します。
   JOB AA:("":1) 
以下の OpenVMS コマンドは、暗黙のネームスペース [USER.TEST] ディレクトリで ^REPORT ルーチンを実行するプロセスを作成します。暗黙のネームスペースは、"^^dir" のように 2 つのキャレット文字が先頭にくるディレクトリ・パスあるいは OpenVMS ファイル仕様です。^REPORT は基本デバイスからの入力を必要としないので、主デバイスとして NULL デバイスが指定されています。report.L ファイルは、基本出力デバイスです。
   JOB ^REPORT:("^^[USER.TEST]"::"NL:":"report.L") 
以下のコマンドは、ルーチン・パラメータ VAL1、および文字列 "DR." を現在のネームスペースの、エントリ・ポイント ABC で開始される、^PROG ルーチンに渡します。このルーチンは 2 つの引数を要求します。Caché は現在のシンボル・テーブルをこのジョブに渡しません。また、使用できる場合は JOB サーバを使用し、主入出力として tta5: を使用します。
   JOB ABC^PROG(VAL1,"DR."):(:0:"tta5:")
メモ
Caché が割り当てるジョブ番号とメモリ・パーティション
ジョブ起動プロセスの開始後、Caché は、そのプロセスに個別のメモリ・パーティションと、一意のジョブ番号 (またはプロセス ID、PID とも言われます) を割り当てます。ジョブ番号は、特殊変数 $JOB に保存されます。ジョブの状態 (そのジョブが JOB コマンドで開始されたか否かも含む) は、$ZJOB 特殊変数に格納されます。
ジョブ起動プロセスは、それぞれ別個のメモリ・パーティションを保持しているので、そのプロセスを作成したプロセスやジョブ起動プロセス相互で、共通のローカル変数環境を共用することはありません。ジョブ起動プロセスを開始するときには、パラメータ渡し (routine–params) により、現在のプロセスからジョブ起動プロセスに値を渡すことができます。
JOB コマンドが失敗する一般的な原因は以下のとおりです。
ジョブ間の通信
値渡しのパラメータは、1 方向のみで発生し、それはジョブの起動時のみです。プロセス相互の通信を行うには、双方が合意したグローバル変数を使用する必要があります。このような変数は、プロセス間の情報交換を可能にすることだけが目的なので、一般にスクラッチ・グローバルと呼ばれます。
Note:
特殊なプロセス・パラメータを指定することによって、現在のプロセスのすべてのローカル変数を、呼び出されたプロセスに渡すことができます。
プロセスは、IPC (プロセス間通信) デバイス (デバイス番号 224 ~ 255) を介して通信することもできます。また、UNIX オペレーティング・システムでは、UNIX パイプを介した通信も可能です。
デバイス所有権の設定
Caché は、呼び出されるルーチンが新しいプロセスのデバイス所有権を扱うコード (OPEN コマンドや USE コマンド) を含むと仮定しています。既定のデバイスは、NULL デバイスです。
Caché は、サインイン時に開始されたプロセス以外のプロセスには、既定のデバイスを割り当てません。
ジョブ優先度の設定
%PRIO ユーティリティを使用すると、ジョブ起動プロセスの実行優先度を制御できます。例えば、優先度が HIGH の場合、ジョブ起動プロセスは、対話型プロセスと対等に CPU リソースを争います。
Caché で、ジョブ起動プロセスに対して既定の優先度を設定することもできます。
Raw パーティションで JOB コマンドを使用する (UNIX)
以下のいずれかの方法で、JOB コマンドを Raw パーティションで使用できます。
Raw パーティションで実行しているコマンドとジョブ起動プロセスは、ファイル名を参照するときは常に、フル・パス名を指定する必要があります。また、"." や ".." で開始するパス名は使用してはなりません。これらは特殊な UNIX ファイルであり、Raw パーティションには存在しないからです。これらのルールのいずれかに違反すると、<DIRECTORY> エラーが発生します。
現在のネームスペースの名前を取得するには、以下のコマンドを実行します。
   WRITE $ZUTIL(12,"")
また、Caché ObjectScript の JOB コマンドの代わりに、UNIX のバッチ・コマンド & を使用することもできます。例えば、test という名前のルーチンを Raw ディスク・パーティションでバッチ・ジョブとして開始するには、以下のように入力して、Caché を呼び出します。
$cache "^test" &
DSM-DDP での リモート JOB 要求の取得
DSM-DDP ネットワークの場合、Caché はリモート DSM システムから JOB 要求を取得することができます。JOB 要求には、特定のシステムの特定のネームスペースで開始する、ルーチンの名前が含まれています。形式は以下のとおりです。
JOB label+offset^routine:"Namespace"
ネットワーク・ジョブ要求では、パラメータ渡しはサポートされていません。
この機能を使用すると、既存のサーバ・アプリケーションを DSM から Caché に移動することができます。アプリケーションのクライアント部分は、DSM ホストを変更しなくても動作します。
リモート・ジョブの開始
以下の構文を使用すると、ある Caché システムから別の Caché システムへ、リモート・ジョブを送信できます。
JOB routine[joblocation]:(process-params)
JOB routine|joblocation|:(process-params)
2 つの形式は類似しています。joblocation パラメータを囲むのは、角括弧 ([ ])、または垂直バー ( | ) のどちらでも使用できます。リモート・ジョブは、ルーチン・パラメータを渡すことができません。また、リモート・ジョブはタイムアウトの指定もできません。
プロセス・パラメータはオプションです。しかし、リモート・ジョブは最初のプロセス・パラメータ (nspace) を指定することはできません。これが joblocation パラメータと競合するからです。したがって、2 番目、3 番目、および 4 番目のプロセス・パラメータのみが指定され、指定されない nspace パラメータはコロンで示される必要があります。
joblocation ジョブの場所の指定。角括弧 ([ ]) や垂直バー ( | ) は必須です。
ジョブの場所を指定する構文の形式によって、Caché の動作が異なります。
joblocation 構文 結果
["namespace"] Caché は、この明示的なネームスペースがローカル・システム、またはリモート・システムに既定のデータセットを持っているかを確認します。既定のデータセットがローカル・システムにある場合、Caché は指定されたパラメータを使用してジョブを開始します。既定のデータセットがリモート・システムにある場合、Caché はネームスペースの既定のデータセットのディレクトリでリモート・ジョブを開始します。
["dir","sys"] Caché はこの場所を暗黙のネームスペースの形式 ["^sys^dir"] に変換します。
["^sys^dir"] ジョブは指定されたリモート・システムの指定されたディレクトリ内で実行します。Caché は、ルーチン・パラメータやタイムアウト指定は許可しません。
["^^dir"] ジョブは現在のシステムのローカル・ジョブとして、指定されたディレクトリ (暗黙のネームスペース) で指定されたパラメータを使用して動作します。暗黙のネームスペースは、"^^dir" のように 2 つのキャレット文字が先頭にくるディレクトリ・パスあるいは OpenVMS ファイル仕様です。
["dir",""] Caché は <COMMAND> エラーを返します。
リモート・ジョブでのグローバル・マッピング (Windows)
Caché ではリモート・ジョブに対してグローバル・マッピングを行うことはできません。要求を行っているシステムで、グローバル・マッピングが定義されているかどうかは問題ではありません。グローバル・マッピングが使用できないところでは、そのネームスペースにないグローバルの場所を指すグローバル指定ができる拡張参照を使用してください。拡張参照で指定したネームスペースが、指定したシステムで定義されていない場合、<NAMESPACE> エラーが返されます。ネームスペースと拡張グローバル参照に関する詳細は、"Caché 多次元ストレージの使用法" の "グローバル参照" を参照してください。
リモート・ジョブの成功の確認
要求しているシステムでは、ジョブ開始がターゲット・システムで正常に実行されたかを示す、直接のメッセージを受信しません。しかし、Caché では、ジョブ開始の成功、または失敗を示すメッセージが、ターゲット・システムのコンソール・ログに書き込まれます。
リモート・システムの構成ファイル
リモート・ジョブ要求を受信する予定のシステムには、あらかじめその機能を設定しておく必要があります。
受信システムで [システム管理ポータル] に進み、[構成]→[詳細設定] を選択し、[カテゴリ] プルダウン・リストから [Connectivity] を選択し、[NetworkRemoteJobs] を選択します。“true” の場合、DCP または EDP 経由で受信したリモート・ジョブ要求は、このサーバ上で処理されます。既定は “true” です。
リモート・システムのライセンスでは、リモートで開始されるジョブを実行できる十分なユーザがサポートされている必要があります。
特殊変数 $ZCHILD と $ZPARENT の使用
$ZPARENT には、現在のプロセスをジョブ化したプロセスの PID (process ID) が含まれています。現在のプロセスが JOB コマンドで作成されなかった場合は、0 が含まれます。
$ZCHILD には、JOB コマンドによって最後に作成されたプロセスの PID が含まれています。このプロセスは成功したものでなくてもかまいません。
JOB サーバの使用
JOB サーバは、JOB 要求の処理を待つ Caché プロセスです。JOB サーバに添付されているジョブ起動プロセスは、新しいプロセスを作成する必要があるというオーバーヘッドの付加を回避します。JOB サーバが利用できる場合、それを使用するように設定する switch パラメータを指定した JOB コマンドをユーザが実行するときは常に、Caché は、その処理を行うのに利用できる JOB サーバがあるかを確認します。JOB サーバがない場合は、Caché がプロセスを作成します。使用できる JOB サーバがある場合、JOB はその JOB サーバに添付されます。
JOB サーバで実行されている JOB で HALT が実行された場合、JOB サーバは他の JOB 要求を受け取るまで、ハイバネーション状態になります。JOB サーバで動作していないジョブ起動プロセスは終了し、そのプロセスは削除されます。
JOB サーバ環境と、ジョブ起動プロセス環境では避けられない違いがいくつかあります。これらは、ジョブ起動プロセスを JOB サーバで実行する場合に、セキュリティ上の問題になる可能性があります。ジョブ起動プロセスは通常、Caché および OpenVMS レベルの両方で、JOB コマンドを実行したプロセスのセキュリティ属性をとります。
しかし、JOB サーバで動作しているジョブ起動プロセスは、OpenVMS レベルで JOB サーバ の UIC を使用します。JOB サーバの UIC は、Caché システム・マネージャの UIC と同じで、通常は [1,4] です。これは、JOB サーバが OpenVMS RMS ファイルやデバイスにアクセスするときに、OpenVMS によって最大限のアクセスが許可されることを意味します。Caché をアプリケーション環境で実行した場合は問題はありませんが、Caché をプログラマ・モードで使用した場合は、これが問題になります。
入出力デバイス
一度に 1 つのプロセスだけが、デバイスを所有できます。OpenVMS では、基本入力デバイス、または出力デバイスをクローズすることはできません。これは、ユーザがデバイス 0 をクローズする場合でも、JOB サーバで実行中のジョブが、基本入出力デバイスに対して入力、または出力を実行できないことを意味します。
したがって、JOB サーバに入力を実行させたい場合は、以下を指定します。
このガイドラインに従っていない場合、JOB サーバで実行中のジョブは、基本入出力デバイスに対して、入力や出力を行わなければならなくなったときに、停止します。JOB の出力が頻繁に端末に表示される場合もありますが (SHARE 特権を持っている場合など)、通常は表示されません。
実行されないジョブに関するトラブル・シューティング
ジョブが開始しない場合は、入出力仕様をチェックしてください。Caché が要求されたデバイスをオープンすることができない場合、ジョブは開始されません。NULL デバイス (OpenVMS では NL:、UNIX では /dev/null) は常に利用できることに注意してください。
ジョブが開始されてもすぐに停止される場合は、適切なスワップ領域があることを確認してください。十分なスワップ領域がない場合、ジョブはエラーを受け取ります。
ジョブが開始されない場合は、JOB コマンドで正しいネームスペースを使用していることを確認してください。ネームスペースが $ZUTIL(90,10) を使用して定義されたか否かをテストすることができます。
JOB コマンドが目的通りに実行されない場合は、以下を試してください。
JOB コマンドの終了
ジョブ起動プロセスは、終了する前にそれを作成したプロセスがログオフされた場合でも、最後まで続けられます。
TCP デバイスを使用した JOB コマンド
JOB コマンドを使用して、TCP 並行サーバ を実装することができます。TCP 並行サーバを使用すると、複数のクライアントを同時に処理できます。このモードでは、クライアントは、サーバが他のクライアントのサービスを終了するまで待機する必要はありません。代わりに、クライアントがサーバに要求を送信するたびに、必要に応じてオープンしているクライアントに個別のサブジョブを生成します。このサブジョブが生成された直後に (JOB コマンドから制御が戻ります)、他のクライアントが処理を要求することがあります。サーバは、そのクライアントのサブジョブも同様に生成します。
非並行モードおよび並行モードのクライアント/サーバ接続
並行サーバは、並行サーバ・ビット (値 4 のビット) をオンにした JOB コマンドを使用します。次に JOB コマンドは、生成したプロセスに、principal–input および principal–output プロセス・パラメータにある TCP デバイスを渡します。switch にビット 4 が含まれている場合、常に、プロセス・パラメータ principal–input および principal–output の両方の TCP デバイスを指定する必要があります。また、principal–inputprincipal–output の両方に同じデバイスを使用する必要があります。
並行ビットが設定されている場合、JOB コマンドが、ジョブ起動プロセスに TCP ソケットを渡すことが重要です。追加の機能ごとに適切なビット・コードに 4 を追加すると、JOB コマンドの他の機能と組み合わせることができます。例えば、switch が値 1 のビットを含むときは、シンボル・テーブルが渡されます。並行モードをオンにし、シンボル・テーブルを渡すには、switch の値を 5 にします。
JOB コマンドを実行する前に、principal–input および principal–output に指定するデバイスは、以下の状態になる必要があります。
JOB コマンドの後、生成されているプロセスのデバイスは、継続して TCP ポートで要求を待ち受けていますが、既にアクティブな接続はありません。アプリケーションは、JOB コマンドの実行後 $ZA 特殊変数を確認し、TCP デバイスで CONNECTED ビットがリセットされていることを確認する必要があります。
生成されたプロセスは、指定の TCP デバイスを principal–input デバイスおよび principal–output デバイスの両方に使用し、指定のエントリ・ポイントで開始します。子プロセスの TCP デバイス名は、親プロセスの名前と同じです。TCP デバイスには、付属のソケットが 1 つあります。継承された TCP デバイスは、S (ストリーム) モードです。しかし、子プロセスは、USE コマンドでモードを変更できます。サーバは、TCP デバイスを A (受信) モードでオープンすることをお勧めします。
生成されたプロセスの TCP デバイスは、接続された状態です。これは、デバイスがクライアントからオープンされた後と同じ状態です。生成されたプロセスは、TCP デバイスを USE 0 あるいは USE $PRINCIPAL で使用します。また、TCP デバイスを暗黙的に使用することもできます (以下の例で説明します)。
以下の例は、非常に単純な並行サーバです。このサーバは、クライアントからの接続を検出するたびに子ジョブを生成します。
server ;
     SET io="|TCP|1"
     SET ^serverport=7001
     OPEN io:(:^serverport:"MA"):200
     IF $TEST=0 {
      WRITE !,"Cannot open server port"
      QUIT }
     ELSE { WRITE !,"Server port opened" }
loop     USE io READ x ; Read for accept        
     USE 0 WRITE !,"Accepted connection"
     JOB child:(:5:io:io) ;Concurrent server bit is on
     GOTO loop
child ;
     WRITE $JOB,! ;Send job id on TCP device to be read by client
     QUIT
client ;
     SET io="|TCP|2"
     SET host="127.0.0.1"
     OPEN io:(host:^serverport:"M"):200 ;Connect to server
     IF $TEST=0 {
      WRITE !,"Cannot open connection"
      QUIT }
     ELSE { WRITE !,"Client connection opened" }
     USE io READ x#3:200 ;Reads from subjob
     ELSE  WRITE !,"No message from child" CLOSE io QUIT
     USE 0 WRITE !,"Child is on job ",XECUTE
     CLOSE io
     QUIT
子ジョブは、継承した TCP 接続を使用して、ジョブ ID (この場合は 3 文字とします) をクライアントに渡します。その後、子プロセスは終了します。クライアントは、サーバとの接続をオープンし、その状態で子のジョブ ID を読み取ります。この例では、変数 "host" の値 "127.0.0.1" がローカル・ホスト・マシンへのループバック接続を示しています。host にそのサーバの IP アドレス、または名前が設定される場合は、そのサーバからクライアントを別のマシンにセットアップすることもできます。
原則的には、子プロセスとクライアントはさらに通信が可能で、複数のクライアントが並行して、対応するサーバの子と通信できます。
子プロセスのパーティション・サイズを指定する
Caché は、ジョブ起動子プロセスのパーティション・サイズの指定をサポートします。既定では、ジョブ起動プロセスのパーティション・サイズは、JOB を実行するときには、システム全体の既定のパーティション・サイズと同じになっています。JOB を実行した親プロセスのパーティション・サイズは関係ありません。システム・ワイドなパーティション・サイズは、最大の 16 MB に動的に増大します。
ジョブ起動プロセスのパーティション・サイズ (キロバイト単位) は、JOB コマンドの第 2 プロセス・パラメータで指定できるようになっています。使用する値は、32 の倍数で、範囲は、128 ~ 16384 です。
オプションで、パーティション・サイズのプロセス・パラメータの値を、通常 JOB の第 2 プロセス・パラメータに入れる、他のプロセス情報と組み合わせて指定することもできます。以下の JOB コマンドを考えてみましょう。
JOB ^routine(:544+1)
このコマンドは、ジョブを実行しているプロセスのシンボル・テーブルをジョブ起動プロセスに渡すこと、また、ジョブ起動プロセスのパーティション・サイズを 544 K にすることを指定しています。この第 2 パラメータで、2 つの値 (544 と 1) を 545 として渡すように指定することもできますが、544+1 とした方がわかりやすく、まったく同じ効果もあります。
関連項目