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é プロセスと Caché 外部の他のプロセスとの通信方法について説明します。

TCP/IP によるリモート・クライアント/サーバ通信の詳細は、このドキュメントの "TCP クライアント/サーバ通信" の章を参照してください。

パイプを使用したプロセス通信

Caché プロセスと外部の UNIX® プロセスや Windows プロセスとの間で、パイプを通じてそのオペレーティング・システム・レベルでの通信と同様に通信できます。パイプへの出力の送信と、パイプからの入力の受信ができます。パイプは単方向なので、同じプログラムで読み書きを同時に実行することはできません。

別のプログラムに出力用のパイプを開くと、シーケンシャル・ファイルのように、そのプログラムに書き込むことができます。その後プログラムは、書き込んだ内容を入力ストリームとして使用します。この機能は、Caché プロセスと外部プロセスでリソースを共有する場合に、特に役に立ちます。

例えば、Caché とワード・プロセッシング・プログラムを同時に実行していると、この 2 つのアプリケーション間で適切にプリンタを共有することが必要になる場合があります。Caché は、プロセスが情報をデバイスに送信できるフルアクセス権限を持っています。しかし、大半の UNIX® アプリケーションは、UNIX® の標準ユーティリティ lpsched を使用して、プリンタやスプーリング・ファイルへのアクセスを管理します。

このような UNIX® アプリケーションで出力すると、プリンタ・ポートには直接書き込まれず、lp または lpr というユーティリティが呼び出されます。lp (あるいは lpr) ユーティリティは lpsched を呼び出し、lpsched は、lp (あるいは lpr) を呼び出したジョブのためのプリンタへのアクセスをスケジュールします。lp を使用する場合、印刷開始を待機する必要はありません。lp への印刷ジョブの書き込みが終了したら、すぐにファイルを閉じてもかまいません。印刷の順番の待機中、lp がディスクへのジョブのスプーリングを処理します。

Caché は、OPEN コマンドの拡張機能により、この協調的な環境を実現できます。このコマンドは直接発行できるほか、このコマンドを使用する Caché ユーティリティから発行することもできます。

Caché ユーティリティへのパイプの使用

UNIX® プロセスや Windows プロセスへのパイプと同様に、Caché ユーティリティへのパイプを開くことができます。入出力ユーティリティでパイプを使用する前に、システム管理者は、Caché システムでパイプ・デバイスを定義しておく必要があります。

システム管理者がパイプ・デバイスを定義した後、(%RD のような) ユーティリティの起動時、“Device:” プロンプトに管理者が定義したニーモニックを入力します。出力は、自動的にデバイスに送信されます。

パイプとコマンド・パイプ

Caché は、標準パイプとコマンド・パイプの両方をサポートします。標準パイプは、比較的短いコマンド文字列に使用します。この場合のコマンド文字列は、コマンド名およびその引数が 256 文字未満であることが必要です。コマンド・パイプは、コマンド文字列の長さが 256 文字以上の場合に使用します。どちらの場合も、パイプは UNIX® システムと Windows システムでのみ使用できます。

標準パイプの OPEN

標準パイプの OPEN コマンド構文は以下のとおりです。

OPEN program:(parameters):timeout

program は最初の引数 (デバイス引数) なので、256 文字という OPEN コマンド・デバイス名の制限に従う必要があります。

コマンド・パイプの OPEN

コマンド・パイプの OPEN コマンド構文は以下のとおりです。

OPEN cpipename:program:timeout 
OPEN cpipename:(program:parameters:::closetimeout):timeout

同時に開くコマンド・パイプが 1 つのみである場合、cpipename 引数の値は "|CPIPE|" とすることができます。同時に複数のパイプを開くには、"|CPIPE|xxxxxx" を指定します。xxxxxx は、ユーザ指定の一意な識別子です。この cpipename 引数は、このコマンド以降に実行する USE コマンドおよび CLOSE コマンドで使用するために指定する引数です。

program は 2 番目の引数なので、256 文字に制限されません。program の最大文字数は、プラットフォームに依存します。

プロセス間通信の OPEN コマンド

OPEN コマンドを使用すると、プログラムで Caché 外部のプロセスと通信できます。

OPEN の引数

引数 説明
cpipename コマンド・パイプのみで使用し、"|CPIPE|" または "|CPIPE|xxxxxx" を指定します。xxxxxx は、ユーザ指定の一意な識別子です。
program

コマンド・パイプは、コマンド・シェルを使用して、またはコマンド・シェルを使用せずに (直接) program を実行できます。ほとんどの場合、コマンド・シェルなしで実行することをお勧めします。標準パイプは、コマンド・シェルを使用して program を実行します。

コマンド・パイプのみ — コマンド・シェルなしで実行するには、/COMMAND=program を指定します。program に引数がある場合は、/ARGS キーワードを使用して引数を指定する必要があります。/COMMAND または /ARGS キーワードを指定した場合、program はコマンド・シェルなしで実行されます:(/COMMAND=program)(/COMMAND=program:/ARGS=arg1)、および (program:/ARGS=arg1) は、すべて有効な構文です。/ARGS は、1 つの引数、引数のコンマ区切りリスト、または配列を取ります。例えば、(/COMMAND=program:/ARGS=arg1,arg2) のようになります。配列を使用して、可変個数の引数を指定できます。 SET array(1)=arg1, array(2)=arg2, array=2  OPEN device:(/COMMAND=cmd:/ARGS=array...)

コマンド・シェルを使用して実行するには、program を指定し、/COMMAND と /ARGS キーワードは両方とも省略します。

program 文字列には、システムにインストールされているプログラムのフルパス名が指定されています。ホスト・システムで実行するコマンドの名前と引数 (ある場合) で構成します。標準パイプでは、256 文字未満に制限されます。コマンド・パイプでは、最大文字数はプラットフォームに依存しますが、ほとんどは 256 文字以上が可能です。

parameters

Read。標準パイプでは、“Q” または “QR” を指定して、他のプロセスからの入力を受け取るキューまたはパイプを開きます。コマンド・パイプの場合、コマンド・パイプは間違いなくパイプであるため、“Q” 文字コードは必要ありません。“R” を指定します。

Write。標準パイプでは、“QW” を指定して、他のプロセスに入力を送信するキューを開きます。コマンド・パイプの場合、コマンド・パイプは間違いなくパイプであるため、“Q” 文字コードは必要ありません。“W” を指定します。

/キーワード・パラメータを使用し、これらのパラメータおよび他のパラメータをコロンで区切って指定できます。例えば、OPEN "|CPIPE|":(cmd:/READ:/IOTABLE="UTF8") のようになります。以下のオプションのキーワード・パラメータは、パイプで一般的に使用します。

“K/name/” (あるいは “Knum”) : 変換がシステム全体で有効になっている場合、入出力変換を有効にします。テーブル名を指定することで、変換の基本となっている既存の定義済みテーブルを特定します。プロトコルのオンとオフを切り替える “+” オプションと “-” オプションは、“K” プロトコルでは使用できません。

“Y/name/” (あるいは “Ynum”) : $X/$Y というアクション・テーブルを使用するようシステムに指示します。テーブル名を指定することで、変換の基本となっている既存の定義済み $X/$Y アクション・テーブルを特定します。$X/$Y アクションは常に使用できます。Y が指定されず、システム既定の $X/$Y が定義されていない場合、組み込みの $X/$Y アクション・テーブルを使用します。プロトコルのオンとオフを切り替える “+” オプションと “-” オプションは、Y プロトコルでは使用できません。

上記のパラメータでは、“S” (ストリーム)、“F” (固定長)、または “U” (未定義長) の各モード・パラメータを指定できます。“V” (可変長) モード・パラメータを指定することはできません

文字コードとキーワード・パラメータの一覧は、このドキュメントの “シーケンシャル・ファイルの入出力” の章の "OPEN モード・パラメータ" を参照してください。

closetimeout オプション — UNIX® のみ : パイプしたコマンドのデバイスを閉じるときに、CLOSE コマンドがコマンド処理の終了を待機する秒数を指定できます。既定値は 30 秒です。この closetimeout は、プロセス間通信の CLOSE コマンドの引数に “I” (即時) 指定することで無効にできます。
timeout オプション : Caché が OPEN の正常終了を待機する最大秒数で、正の整数です。Caché がタイムアウトになる前にプロセス間通信を開くことができた場合、$TEST を 1 に設定します。開くことができない場合、$TEST を 0 に設定します。タイムアウトを省略するか 0 を指定すると、OPEN は、直ちに制御をプロセスに戻します。

OPEN コマンド・パイプの例

有効なコマンド・パイプ OPEN 文は以下のとおりです。それぞれの例では、10 秒のタイムアウトを指定しています。

  OPEN "|CPIPE|1":"/nethome/myprog":10                                  // using shell, no args
  OPEN "|CPIPE|1":("/nethome/myprog":/WRITE):10                         // using shell, no args, WRITE
  OPEN "|CPIPE|2":/COMMAND="/nethome/myprog":10                         // no shell, no args
  OPEN "|CPIPE|3":("":/COMMAND="/nethome/myprog"):10                    // no shell, no args
  OPEN "|CPIPE|4":(/COMMAND="/nethome/myprog":/ARGS=arg1):10            // no shell, 1 arg
  OPEN "|CPIPE|5":("/nethome/myprog":/ARGS=arg1):10                     // no shell, 1 arg
  OPEN "|CPIPE|6":("/nethome/myprog":/ARGS=arg1:/WRITE):10              // no shell, 1 arg, WRITE
  OPEN "|CPIPE|7":(/COMMAND="/nethome/myprog":/ARGS=arg1,arg2):10       // no shell, 2 args
  OPEN "|CPIPE|8":(/COMMAND="/nethome/myprog":/ARGS=args...:/WRITE):10  // no shell, args array, WRITE

Windows システムでは、引数に空白または二重引用符文字 (") を含めることができます。この場合、次のように、引数を引用符で囲むことができ、リテラルの二重引用符文字は、二重にすることによってエスケープできます。

  OPEN "|CPIPE|9":("/nethome/myprog":/ARGS="string with blanks"):10
  OPEN "|CPIPE|10":("/nethome/myprog":/ARGS="string with literal "" character"):10

エラー

IPC ではないデバイスに “QW” パラメータを指定して OPEN コマンドを発行すると、このデバイスに書き込もうとしたときに <WRITE> エラーが発生します。

以下の UNIX® の例では、lp プログラムへの出力パイプを開きます。このプログラムのパス名は /usr/bin/lp です。その後、パイプを通じて、グローバル ^TEXT からプリンタに出力を送信します。

print ; Send the first layer of global ^TEXT to the printer. 
      SET IO="/usr/bin/lp"
      OPEN IO:"QW"   ; Open the pipe to lp 
      USE IO WRITE "The first layer of ^TEXT",!   ; Print the title 
      ;  . . .
      ;  Print each line, using $ORDER on the global ^TEXT
      USE IO WRITE !,"The End.",#
      CLOSE IO    ; close the pipe, spooling the file to lpsched 
      QUIT

この例を、OPEN コマンドが lp プログラムに引数を渡すように変更できます。例えば、lp から laserjet というプリンタ・デバイスに出力を送信するように指定する場合、SET コマンドを以下のように記述します。

   SET IO="/usr/bin/lp -dlaserjet"

以下の例は、外部プログラムからの読み取り方法を示しています。このプロセスは UNIX® プログラム who への入力パイプを開くので、who では現在 UNIX® にログインしているすべてのユーザの ID を読み取ることができます。

getids ; read the login IDs of everybody currently on 
       SET IO="/usr/bin/who"
       SET $ZTRAP="EOT"
       KILL LOGINS 
       OPEN IO:"Q"
       ; note that "R" (the default) is understood 
       SET users=0
       FOR I=0:0 {
          USE IO
          READ USER
          SET users=users+1
          SET LOGINS(USER)=""
          }
       QUIT
EOT    SET $ZTRAP=""
       USE 0
       WRITE !,USERS," is/are currently logged on.",!
       CLOSE IO
       QUIT

Windows システムでは、CPIPE OPEN program 引数で /COMMAND または /ARGS が指定されている場合、CreateProcess() を使用してコマンドが実行されます。CreateProcess() が失敗した場合、OPEN は <NOTOPEN> エラーで失敗します。GetLastError() の値は、$SYSTEM.Process.OSError()Opens in a new tab を使用して利用できます。

UNIX® システムでは、CPIPE OPEN program 引数で /COMMAND または /ARGS が指定されている場合、exec() を発行する新しいプロセスを作成してコマンドが実行されます。exec() が失敗した場合、OPEN は <NOTOPEN> エラーで失敗します。exec() の errno は、$SYSTEM.Process.OSError()Opens in a new tab を使用して利用できます。

OPEN コマンド・キーワードと USE コマンド・キーワード

以下のテーブルは、OPEN コマンドと USE コマンドを使用して、プロセス間通信パイプを制御するキーワードの説明です。

プロセス間通信パイプの OPEN コマンド・キーワードと USE コマンド・キーワード
キーワード 既定値 説明

/IOTABLE[=name]

または

/IOT[=name]

name が指定されない場合、デバイスの既定の入出力変換テーブルを使用します。 K\name\ パラメータ・コードに相当します。デバイスの入出力変換テーブルを構築します。

/TRANSLATE[=n]

または

/TRA[=n]

1 K パラメータ・コードに関連します。/TRANSLATE を指定した場合、または /TRANSLATE=nn が 0 以外の場合、デバイスの入出力変換が有効になります。/TRANSLATE=nn が 0 の場合はデバイスの入出力変換が無効になります。

/XYTABLE[=name]

または

/XYT[=name]

name が指定されていない場合、デバイスの既定の $X/$Y アクション・テーブルを使用します。 Y\name\ パラメータ・コードに相当します。デバイスの $X/$Y アクション・テーブルを構築します。

OPEN のみのキーワード

以下のテーブルは、OPEN コマンド・キーワードのみを使用して、プロセス間通信パイプを制御するキーワードの説明です。

プロセス間通信パイプの OPEN のみのコマンド・キーワード
キーワード 既定値 説明

/IGNOREEOF[=n]

または

/IGN[=n]

0 I パラメータ・コードに相当します。READ 処理を、無制限に、または指定したタイムアウトを超えるまで (EOF 条件は無視して) 再試行するように指定します。/IGNOREEOF を指定した場合、または /IGNOREEOF=nn が 0 以外の場合、パラメータ・コードが有効になり、/IGNOREEOF=nn が 0 の場合は無効になります。

/PARAMS=str

または

/PAR=str

既定なし パラメータ・コードの位置パラメータに相当します (位置に依存しない方法でパラメータ・コード文字列を指定する方法を提供します)。

/QUEUE

または

/QUE

デバイスはプロセス間通信パイプとして認識されません。 “Q” パラメータ・コードに相当します。プロセス間通信パイプを開くように指定します。このコマンドを使用するには、%System_Callout リソースに対する Use 許可が必要になる点に注意してください。
/Read /READ も /WRITEも指定されない場合、既定は Read です。 “R” パラメータ・コードに相当します。キューまたはパイプを開き、他のプロセスからデータを受け入れるように指定します。

/Write

または

/WRI

/READ も /WRITEも指定されない場合、既定は Read です。 “W” パラメータ・コードに相当します。キューまたはパイプを開き、他のプロセスにデータを送信するように指定します。

プロセス間通信の READ コマンド

構文

READ:pc readargument,...

READ コマンドは、パイプからデータを読み取ります。

readargument には、以下を指定できます。

formatting-mode
string
variable:timeout
*variable:timeout
variable#n:timeout

パイプで I formatting-mode パラメータを使用します。I パラメータは、<ENDOFFILE> エラーの後ろに続く特定のレコードで発生するデータを損失せずに、名前付きパイプに時間制限の付いた READ を発行できます。このパラメータを READ で使用する場合、READ は <ENDOFFILE> メッセージを無視します。

I formatting-mode の既定値は “off” です。このパラメータを、タイムアウトなしに READ コマンドに組み込むと、プロセスにデータが指定されるまで、プロセスを停止します。

プロセス間通信の CLOSE コマンド

“Q” (/QUEUE) パラメータ・コードと共に OPEN を使用して子プロセスを作成すると、その子プロセスが CLOSE 操作の後でデバイスに残ることがあります。キュー待機プロセス間通信パイプの残存性はプラットフォームによって異なります。UNIX システムでは、子プロセスは常に CLOSE の後まで残ります。Windows システムでは、プロセスの残存性はプロセスの古さに依存します。起動したばかりの子プロセスは CLOSE 操作の後まで残りませんが、完全に確立された子プロセスは CLOSE の後まで残ります。

UNIX システムの場合は、パイプしたコマンドのデバイスを閉じるときに、CLOSE コマンドが待機する時間を指定できます。このタイムアウトの既定値は 30 秒です。この既定値は、OPEN コマンドの closetimeout 位置指定引数を指定することで変更できます。CLOSE コマンドのデフォルトのタイムアウト値または指定したタイムアウト値は、オプションの “I” 位置指定引数を指定することで無効にできます。“I” 引数は、即時に閉じる (1 秒後に閉じる) ことを指定します。CLOSE の構文は、次のとおりです。

CLOSE cpipename:"I"

名前付きパイプを使用した Visual Basic との通信

Windows では、Caché の名前付きパイプを TCP デバイスと同様に使用しますが、“|TCP|nnn” ではなく “|NPIPE|nnn” というデバイス名を使用します。OPEN 引数は以下のとおりです。

OPEN "|NPIPE|3":(server:pipename)

server は Windows NT マシン名、pipename は接続されているパイプ名です。Windows 95/98 マシンは、名前付きのパイプ・サーバにはなれませんが、サーバへの接続は可能です。

ローカル・パイプ名に接続するには、サーバとして "." (引用符で囲まれたピリオド) を使用します。(サーバとして) パイプを生成するには、サーバ名として "" (内容なしの引用符) を使用します。以下は、すべて有効な server 名です。

   OPEN "|NPIPE|3":(".":"localpipe")
   OPEN "|NPIPE|3":("mother":"test")
   OPEN "|NPIPE|3":("":"info")

サーバは、名前付きパイプを開き、クライアント側が同じ名前付きパイプを開く前に、すぐに書き込みを発行できます。クライアント側が名前付きパイプを開くまで書き込み操作はハングします。ユーザは、Control-C を発行してこのハングを中断できます。

パイプを開くと、それは通常のデバイスと同様に動作します。サーバ側では、以下のコードを使用して、TCP で実行されるようにクライアントから切断します。

   USE "|NPIPE|3":"DISCONNECT"

または、以下を実行します。

   USE "|NPIPE|3" WRITE *-2

OPEN コマンド・キーワード

以下のテーブルは、OPEN コマンド・キーワードのみを使用して、名前付きパイプを制御するキーワードの説明です。

名前付きパイプの OPEN コマンド・キーワード
キーワード 既定値 説明

/HOSTNAME=str

または

/HOS=str

既定は "" (内容なしの引用符) です。サーバとしてパイプを開きます。 Windows NT ワークステーション/サーバ名を指定するサーバ位置パラメータに相当します。サーバとしてパイプを開いている場合、このキーワードを指定する必要はありません。ローカル・パイプ名に接続するには、"." (引用符で囲まれたピリオド) を使用します。

/IBUFSIZE=n

または

/IBU=n

2048 パイプからデータを受け取り、アプリケーションに送信するまで保持する名前付きパイプの入力バッファ・サイズを指定します。

/INSTANCES=n

または

/INS=n

1 名前付きパイプに可能な最大インスタンス数を指定します。1 以上の値を指定すると、複数のサーバが名前付きパイプのインスタンスを開くことができます。したがって、一度に複数のクライアントに対処できます。

/OBUFSIZE=n

または

/OBU=n

2048 オペレーティング・システムが使用する出力バッファのサイズを指定します。オペレーティング・システムは、システムによる制約に従ってバッファを分割するので、このバッファ・サイズを推奨します。

/PIPENAME=str

または

/PIP=str

既定なし パイプ名を指定する pipename 位置パラメータに相当します。

Caché プロセス間通信

インタジョブ・コミュニケーション (IJC) デバイスは、Caché プロセス間で複数の情報を送受信できる一連の特別なデバイス番号です。プロセスは、ジョブ起動型プロセスあるいは対話型プロセスのいずれかです。

IJC デバイスはペアで機能します。IJC デバイスは 256 ペアまで使用可能です。データの読み取りには、レシーバと呼ばれる偶数番号のデバイスを使用します。データの書き込みには、トランスミッタと呼ばれる奇数番号のデバイスを使用します。トランスミッタからの読み取り、またはレシーバへの書き込みを実行しようとすると、<NODEV> エラーを生じます。

他のデバイスと同様に、入出力コマンドを IJC デバイスに発行します。OPEN コマンドと USE コマンドをデバイスへ発行後、プロセスは以下のコマンドを発行できます。

  • レシーバ・デバイスへの READ コマンド

  • トランスミッタ・デバイスへの WRITE コマンド

デバイスを開くことができるのは、一度に 1 つのプロセスのみです。

デバイスのペアは、Caché デバイス・テーブルでマップされた相対順序に基づいています。この順序は、管理ポータルの構成オプションを使用して表示および編集できます。

デバイスの各ペアは、IJC メモリ・バッファに対応します。プロセスが、WRITE コマンドを奇数番号の IJC デバイスに発行すると、Caché は、デバイスとペアになっているバッファにデータを書き込みます。別のプロセスが、ペアになっている偶数番号のデバイスに READ コマンドを発行した場合、Caché は同じバッファからデータを読み取ります。

書き込まれたデータは、先入れ先出し法でメモリにバッファされます。デバイスが空の場合に READ を実行すると、他のプロセスが対応する WRITE を発行するまでプロセスは中断します。バッファが一杯の場合に WRITE を実行すると、他のプロセスがバッファを読み取るまで中断します。

バッファにメッセージを書き込んだ後、トランスミッタを終了した場合も、メッセージが読み取られるまではバッファに残されます。複数のユーザが、OPENUSEWRITE、および CLOSE の各コマンドを、一度に 1 つずつトランスミッタに発行できます。その後の READ コマンドにより、記述された順番ですべてのメッセージを取得します。

インタジョブ・コミュニケーション・デバイスへのメモリ・バッファの指定

システム管理者は、管理ポータルを使用して IJC バッファを構成できます。システム, 構成, メモリ詳細設定 を選択します。以下の 2 つのパラメータを設定できます。

  • [ijcnum] : IJC デバイスの最大数。0 から 256 の範囲で指定し、既定は 16 です。この設定を編集した場合、変更内容を適用するには Caché を再起動する必要があります。

  • [ijcbuff] : 各 IJC バッファの最大サイズ (バイト単位)。範囲は 512 ~ 8192 です。既定のサイズは 512 バイトです。この設定を編集した場合、変更内容を適用するには、Caché を再起動する必要があります。

各 IJC デバイスは、[ijcbuff] で指定されたサイズを持つ 1 つの IJC バッファに対応しています。メッセージは、[ijcbuff] マイナス 1 の長さで書き込むことができます。

IJC バッファを無効にする

IJC デバイスを使用しない場合は、IJC デバイスの最大サイズ ([ijcnum]) を 0 に設定して、メモリの占有を避けることができます。

IJC デバイス番号

IJC デバイスは、Caché で自動的に番号付けされます。実際の識別番号は、システムで構成される IJC バッファの最大数に依存します。

以下のテーブルは、割り当てる IJC バッファ数に応じてシステムで設定可能な IJC デバイス番号の範囲を示しています。

例えば、8 つの IJC バッファを割り当てる場合、224 から 239 までのデバイス番号がシステムに定義されます (READ デバイスに偶数、WRITE デバイスには奇数が割り当てられます)。

また、94 個の IJC バッファを割り当てる場合、224 から 255、64 から 199、4 から 19、2048 から 2051 のデバイス番号の範囲が定義されます。任意の奇数/偶数番号のペアを、OPENUSEREADWRITE、および CLOSE の各コマンドで使用できます。

IJC デバイス番号
バッファの割り当て数 READ デバイス番号 WRITE デバイス番号
1 224 225
2 226 227
3 228 229
... ...  
15 252 253
16 254 255
17 64 65
18 66 67
... ... ...
83 196 197
84 198 199
85 4 5
86 6 7
87 8 9
88 10 11
89 12 13
90 14 15
91 16 17
92 18 19
93 2048 2049
94 2050 2051
95 2052 2053
... ... ...
254 2370 2371
255 2372 2373
256 2374 2375

IJC デバイスへの入出力コマンド

すべての標準入出力コマンド、OPENUSEREADWRITE、および CLOSE を IJC デバイスで使用できます。

OPEN コマンド

OPEN コマンドは、IJC デバイスの使用を確保します。

構文
OPEN device::timeout

各項目の内容は次のとおりです。

device 上記のテーブルのデバイス番号を記述します。偶数番号のデバイスを OPEN で開き、READ コマンドを発行します。奇数番号のデバイスを OPEN で開き、WRITE コマンドを発行します。2 つのプロセス間で通信するには、デバイスをペアで開く必要があります。
timeout オプション — Caché が OPEN の正常終了を待機する最大秒数で、正の整数です。0 を指定すると、OPEN は即座に制御をプロセスに戻します。

この例は、読み書き用のそれぞれのデバイスを開き、2 つのプロセス間で通信する方法を示しています。

Process A                          Process B 
OPEN 227 USE 227 WRITE "MSG_1"
WRITE "MSG_2"                       OPEN 226 USE 226 READ X
CLOSE 227                           CLOSE 226
OPEN 224 USE 224 READ X             WRITE X
CLOSE 224                           MSG_1
WRITE X                             .
MSG_3                               .
                                    .
                                    OPEN 225 USE 225 WRITE "MSG_3" 
                                    CLOSE 225

Process A は、デバイス 227 を開き、そこに MSG_1 を書き込んで開始します。Caché は、このメッセージをデバイス 226 と 227 で共有しているバッファに書き込みます。その後、Process A は 2 番目のメッセージを同じバッファに書き込みます。新規の Process B が、対のデバイス 226 を開き、バッファから最初のメッセージ (MSG_1) を読み取ります。

現在の Process A は、メッセージを読み取るために、別のデバイス 224 を開く必要があります。このデバイスと対になる 225 のバッファは現在空なので、Process B がデバイス 225 を開き、MSG_3 を書き込むまで、Process A は待機します。Caché が、このメッセージをデバイス 224 と 225 で共有しているバッファに配置した後、デバイス 224 への READ コマンドが成功します。

FeedbackOpens in a new tab