Skip to main content

ローカル・プロセス間通信 (パイプ)

ここでは、パイプ経由での InterSystems IRIS® データ・プラットフォーム外のプロセスとの通信の設定方法について説明します。

概要

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

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

InterSystems IRIS ユーティリティへのパイプの使用

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

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

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

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

標準パイプの OPEN

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

OPEN program:(parameters):timeout

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

既に開いている標準パイプに対して OPEN コマンドが発行された場合、2 つ目の 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 コマンドが発行された場合、2 つ目の OPEN は無視されます。エラーは発行されません。

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

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

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 を指定します。

Read および Write。Read パイプまたは Write パイプのどちらにもなれる標準パイプの場合は、QRW を指定して、別のプロセスから入力を受け入れるキューまたはパイプ、あるいは別のプロセスに入力を送信するキューまたはパイプを開きます。コマンド・パイプの場合、パイプであることは間違いないので Q 文字コードは必要ありません。RW を指定します。

/キーワード・パラメータを使用し、これらのパラメータおよび他のパラメータをコロンで区切って指定できます。例えば、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

オプション : InterSystems IRIS が OPEN の正常終了を待機する最大秒数で、正の整数です。InterSystems IRIS がタイムアウトになる前にプロセス間通信を開くことができた場合、$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

OPEN のエラー

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 コマンドを使用して、プロセス間通信パイプを制御するキーワードの説明です。

/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 コマンド・キーワードのみを使用して、プロセス間通信パイプを制御するキーワードの説明です。

/ENV=environmentvars

新しいプロセスで設定する環境変数を指定します。値を指定するには、以下の 2 つの方法があります。

  • 明示的に指定。以下に例を示します。

    /ENV=(name1:value1,name2:value2)
    
  • 多次元配列を介して指定。以下に例を示します。

     Set arr(name1)=value1
     Set arr(name2)=value2
    
    // then later use the following in the OPEN command:
      /ENV=arr...
    

この例では、2 つの環境変数が示されていますが、いくつでもかまいません。明示的リストは括弧で囲む必要があります。

/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 コマンドに組み込むと、プロセスにデータが指定されるまで、プロセスを停止します。

CPIPE の終了コード

コマンド・パイプ (|CPIPE|) プロセスの終了コードを取得できます。この終了コードは、|CPIPE| デバイスが閉じる前に取得する必要があります。これを取得するには、%SYSTEM.ProcessOpens in a new tab クラスの PipeExitCodeOpens in a new tab メソッドを使用します。終了コードは常に整数値です。終了コードが使用可能でない場合、以下の例のように、このメソッドは NULL 文字列を返し、説明と共にステータス引数を設定します。

  SET exitcode=$SYSTEM.Process.PipeExitCode(device, .status)
  IF exitcode="" {DO $SYSTEM.OBJ.DisplayError(status)}
  ELSE {WRITE "CPIPE exit code is ",exitcode } 

UNIX® システムでは、非シェル・コマンド、つまり /COMMAND または /ARGS で開いた CPIPE デバイスについてのみ終了コードが使用可能です。

プロセス間通信の 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 では、InterSystems IRIS の名前付きパイプを TCP デバイスと同様に使用しますが、|TCP|nnn ではなく |NPIPE|nnn というデバイス名を使用します。OPEN 引数は以下のとおりです。

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

server はマシン名、pipename は接続されているパイプ名です。

ローカル・パイプ名に接続するには、サーバとして "." (引用符で囲まれたピリオド) を使用します。(サーバとして) パイプを生成するには、サーバ名として "" (内容なしの引用符) を使用します。以下は、すべて有効な 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 コマンド・キーワードのみを使用して、名前付きパイプを制御するキーワードの説明です。

/HOSTNAME=str

または :

/HOS=str

既定 : 既定は "" (空文字列) です。サーバとしてパイプを開きます。

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

/IBUFSIZE=n

または :

/IBU=n

既定値 : 2048

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

/INSTANCES=n

または :

/INS=n

既定値 : 1

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

/OBUFSIZE=n

または :

/OBU=n

既定値 : 2048

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

/PIPENAME=str

または :

/PIP=str

既定値なし。

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

関連項目

FeedbackOpens in a new tab