この章では、メッセージパターン情報を ToolTalk サービスに提供する方法について説明します。ToolTalk サービスは、メッセージパターンを使用してメッセージの受信側を判定します。メッセージを受信した後で、ToolTalk サービスは、メッセージを現在のメッセージパターンのすべてと比較して一致するパターンを見つけます。パターンが一致すると、メッセージは、メッセージパターンを登録したアプリケーションに配信されます。
動的、静的、またはその両方を使用して、メッセージパターン情報を ToolTalk サービスに提供できます。選択できる方法は、受信したいメッセージの型によって異なります。
受信したいメッセージの型がアプリケーションの実行中に変化すると思われる場合は、「動的な方法」によって、アプリケーションの起動後もメッセージパターン情報を追加、変更、または削除できます。
アプリケーションが実行中でないときに、メッセージにアプリケーションを起動させたい場合またはメッセージを待ち行列に入れたい場合は、「静的な方法」がこれらの指示を簡単に指定できる方法を提供します。また静的な方法は、定義した一連のメッセージを受信したい場合に、メッセージパターン情報を簡単に指定できる方法も提供します。詳細は、第 10 章「静的メッセージパターン」を参照してください。
ToolTalk サービスにメッセージパターンを提供する選択方法に関係なく、現在の各セッションおよびファイル情報によってこれらのパターンを更新すると、処理の対象とするセッションまたはファイルを参照する、すべてのメッセージを受信します。
メッセージパターンの属性は、ユーザーが受信したいメッセージの型を指定します。1 つの値しか設定されない属性があっても、1 つのパターンに追加する属性のほとんどに、複数の値を設定できます。
メッセージパターンに設定できる属性の完全なリストを表 3-1 に示します。
表 3-1 ToolTalk メッセージパターンの属性
パターン属性 |
値 |
説明 |
---|---|---|
カテゴリ |
|
メッセージに表示されている操作を実行するか、メッセージの監視だけを行うかを宣言する |
配信範囲 |
|
セッションおよびファイル、またはそのどちらかに関するメッセージを対象としていることを宣言する。sessid およびファイル名を更新するためにメッセージパターンを登録した後、セッションまたはファイルを結合する |
引数 |
引数または結果 |
処理の対象とする操作の定位置引数を宣言する |
コンテキスト |
<名前, 値> |
処理の対象とする操作のキーワードまたは非定位置引数を宣言する |
クラス |
|
通知、要求、提供、またはそれらすべてを受信するかどうかを宣言する |
ファイル |
char *pathname |
処理の対象とするファイルを宣言する。配信範囲がファイルに関係しない場合、このパターン属性は無効である |
オブジェクト |
char *objid |
処理の対象とするオブジェクトを宣言する |
操作 |
char *opname |
処理の対象とする操作を宣言する |
otype |
char *otype |
処理の対象とするオブジェクトの型を宣言する |
アドレス |
|
処理の対象とするアドレスの型を宣言する |
処置 |
|
インスタンスを実行中でなければ、アプリケーションへのメッセージの処理方法を ToolTalk サービスに指示する |
送信側 |
char *procid |
処理の対象とする送信側を宣言する |
sender_ptype |
char *ptype |
処理の対象とする送信側プロセスの型を宣言する |
セッション |
char *sessid |
処理の対象とするセッションを宣言する |
状態 |
|
処理の対象とするメッセージの状態を宣言する |
少なくとも指定しなければならないすべてのメッセージパターンは次のとおりです。
カテゴリ - アプリケーションが、メッセージに表示されている操作を実行するか、またはメッセージの表示だけを行うか
メッセージの監視だけを行う場合は、TT_OBSERVE
を使用します。
メッセージによって要求される操作を実行する場合は、TT_HANDLE
を使用します。
別の HANDLE カテゴリの任意のパターンを使用する前に TT_HANDLE_PUSH
のカテゴリがあり、その最後に登録したパターンを使用したい場合は、TT_HANDLE_PUSH
を使用します。
TT_HANDLE
を使用したいときは、TT_HANDLE_ROTATE
を使用します。適切な TT_HANDLE_PUSH
パターンが見つからないときは、他の TT_HANDLE
パターンを使う前に、一番古くに使用された TT_HANDLE_ROTATE
パターンを使ってメッセージを配信します。
配信範囲 - アプリケーションが、特定のセッションまたはファイルに関するメッセージを処理の対象としているか
自分のセッション内で他のプロセスからメッセージを受信するには、TT_SESSION
を使用します。
結合したファイルに関するメッセージを受信するには、TT_FILE
を使用します。
このセッションにいる間に結合したファイルへのメッセージを受信するには、TT_FILE_IN_SESSION
を使用します。
ファイル、セッション、または結合したファイルとセッションの両方のメッセージを受信するには、TT_BOTH
を使用します。
ToolTalk サービスは、次のようにメッセージ属性をパターン属性と比較します。
次の場合は、ToolTalk サービスはメッセージ属性が一致したと見なします。
パターン属性が指定されていない
パターンが、コンテキストスロットを指定しない
パターンが、空のコンテキストスロットを持っている
指定するパターン属性が少ないほど、より多くのメッセージを受信する資格を持つようになります。
パターン属性用に指定された値が複数ある場合は、値の 1 つがメッセージ属性値に一致しなければなりません。値が一致しない場合、ToolTalk サービスは、アプリケーションを受信側とは見なしません。
メッセージにコンテキストスロットが含まれる場合、ToolTalk サービスは、アプリケーションを受信側とは見なしません。ただし、次のような場合は除きます。
パターンのコンテキストスロットに指定した値が、メッセージのコンテキストスロットに指定された値と一致する
複数のコンテキストスロットがメッセージに指定された場合、メッセージの各コンテキストスロットの値は、パターン内の対応するコンテキストスロットの値に一致する
セッションだけの配信範囲
ファイルだけの配信範囲
特定のセッションのファイルだけの配信範囲
ファイルおよびセッションのどちらか、または両方への配信範囲
ファイルの配信範囲指定機能を使用できるのは、NFS ファイルシステムと UFS ファイルシステムだけです。たとえば、tmpfs ファイルシステムなどの他の型のファイルシステムでは、ファイルへの配信範囲は指定できません。
TT_SESSION
型は、セッションだけを配信範囲とします。静的セッション配信範囲指定のパターンは、明示的な tt_session_join 呼び出しに配信範囲の値を設定するように要求します。動的セッション配信範囲指定のパターンは、tt_session_join 呼び出しまたは tt_pattern_session_add
呼び出しのどちらかによって設定できます。
これらの呼び出しが指定するセッションは、デフォルトセッションでなければなりません。
例 3-1 は、静的セッション配信範囲指定のパターンを示します。例 3-2 は、動的セッション配信範囲指定のパターンを示します。
Obtain procid |
tt_open(); |
Ptype is scoped to session |
tt_ptype_declare(ptype); |
Join session |
tt_session_join(tt_default_session()); |
Obtain procid |
tt_open(); |
Create pattern |
Tt_pattern pat = tt_create_pattern(); |
Add scope to pattern |
tt_pattern_scope_add(pat, TT_SESSION); |
Add session to pattern |
tt_pattern_session_add(tt_default_session()); |
Register pattern |
tt_pattern_register(pat); |
TT_FILE
型は、ファイルだけを配信範囲とします。例 3-3 は、静的ファイル配信範囲指定のパターンを示します。例 3-4 は、動的ファイル配信範囲指定のパターンを示します。
Obtain procid |
tt_open(); |
Ptype is scoped to file |
tt_ptype_declare(ptype); |
Join file |
tt_file_join(file); |
Obtain procid |
tt_open(); |
Create pattern |
Tt_pattern pat = tt_create_pattern(); |
Add scope to pattern |
tt_pattern_scope_add(pat, TT_FILE); |
Add file to pattern |
tt_pattern_file_add (pat, file); |
Register pattern |
tt_pattern_register(pat); |
TT_FILE_IN_SESSION
型は、指定セッション内の指定ファイルだけを配信範囲とします。この配信範囲設定によってパターンは、ファイルとセッションの両方を配信範囲とするメッセージだけに一致します。例 3-5 では、セッションを追加してからパターンを登録します。
TT_FILE_IN_SESSION
配信範囲指定のパターンへのセッション追加
Obtain procid |
tt_open(); |
Create pattern |
Tt_pattern pat = tt_create_pattern(); |
Add scope to pattern |
tt_pattern_scope_add(pat,TT_FILE_IN_SESSION); |
Add file to pattern |
tt_pattern_file_add(pat, file); |
Add session to pattern |
tt_pattern_session_add(pat, tt_default_session()); |
Register pattern |
tt_pattern_register(pat); |
例 3-6 は、パターンを登録してからセッションを結合します。
TT_FILE_IN_SESSION
配信範囲指定のパターンのセッションを設定するためのセッション結合
Obtain procid |
tt_open(); |
Create pattern |
Tt_pattern pat = tt_create_pattern(); |
Add scope to pattern |
tt_pattern_scope_add(pat, TT_FILE_IN_SESSION); |
Add file to pattern |
tt_pattern_file_add(pat, file); |
Register pattern |
tt_pattern_register(pat); |
Join session |
tt_session_join(tt_default_session()); |
例 3-7 は、静的パターンの配信範囲の値を設定します。
TT_FILE_IN_SESSION
静的パターンの配信範囲値の設定
Obtain procid |
tt_open(); |
Declare Ptype |
Tt_ptype_declare(ptype); |
Join File |
tt_file_join(file); |
Join session |
tt_session_join(tt_default_session()); |
TT_BOTH
配信範囲指定のパターンは、ファイル、セッション、またはその両方へ配信範囲指定したメッセージと一致します。しかし、この配信範囲指定を使用する場合は、tt_file_join 呼び出しを明示的に行う必要があります。呼び出しを行わないと、ToolTalk サービスは登録されたパターンのファイルとセッションの両方に配信範囲指定したメッセージだけに一致します。例 3-8 と例 3-9 は、この配信範囲の使用例を示します。
TT_BOTH
配信範囲を使用する動的パターン
Obtain procid |
tt_open(); |
Create pattern |
Tt_pattern pat = tt_create_pattern(); |
Add scope to pattern |
tt_pattern_scope_add(pat, TT_BOTH); |
Add session to pattern |
tt_pattern_session_add(pat,tt_default_session()); |
Add file to pattern |
tt_pattern_file_add (pat, file); |
Register pattern |
tt_pattern_register(pat); |
TT_BOTH
配信範囲を使用する静的パターン
Obtain procid |
tt_open(); |
Declare Ptype |
Tt_ptype_declare(ptype); |
Join file |
tt_file_join(file) |
Join session |
tt_session_join(tt_default_session()); |
同じファイル属性を持つ TT_SESSION
配信範囲指定のメッセージと TT_SESSION
配信範囲指定のパターンを一致させるために、tt_pattern_file_add 呼び出しによって、ファイル属性を TT_SESSION
配信範囲指定のパターンに追加できます (詳細は、例 3-10 を参照してください)。
ファイル属性の値は、パターンの配信範囲に影響しません。
Obtain procid |
tt_open(); |
Create pattern |
Tt_pattern pat = tt_create_pattern(); |
Add scope to pattern |
tt_pattern_scope_add(pat, TT_SESSION); |
Add session to pattern |
tt_pattern_session_add(tt_default_session()); |
Add first file attribute to pattern |
tt_pattern_file_add(pat, file1); |
Add second file attribute to pattern |
tt_pattern_file_add(pat, file2); |
Register pattern |
tt_pattern_register(pat); |
ToolTalk の「コンテキスト」は、メッセージとパターンの両方に明示的に含まれる一連の <名前, 値> のペアです。ToolTalk コンテキストによって、詳細な照合処理を実行できます。
コンテキストを使用して、任意のペアを ToolTalk メッセージとパターンに関連付けることができます。また、一連のメッセージの受信側を制限できます。ToolTalk コンテキスト属性が提供する、制限付きパターン照合の一般的な使用方法は、サブセッションを作成することです。たとえば、2 つの異なるプログラムは、各プログラムのために動作するブラウザ、エディタ、デバッガ、構成マネージャなどのツールによって同時にデバッグできます。各ツールセットのメッセージとパターンのコンテキストスロットは、異なる値を持っています。これらの値の正常な ToolTalk パターンの照合は、2 つのサブセッションを別々に保持します。
ToolTalk コンテキスト属性が提供する、制限付きパターン照合の別の使用方法は、環境変数とコマンド行引数の情報を、ToolTalk サービスが起動するツールに提供することです。
ToolTalk のパターン引数には、文字列、バイナリデータ、および整数値があり、受信メッセージと照合をとるのに ToolTalk サービスが使用します。
引数が配置されたパラメタであるのに対して、コンテキストは名前付きのパラメタですので、引数はコンテキストによって異なります。メッセージに設定されているコンテキストの順番で、受信および送信メッセージ内の順番が決まります。つまり、パターンで設定されている引数の順番とタイプに一致します。引数は位置が重要な意味を持つため、受信メッセージの最初の引数ではない引数のマッチングをとりたい場合は、パターンの中間引数としての「ワイルドカード」引数を追加する必要があります。ワイルドカード引数は、「ALL」の vtype で NULL 値を持ちます。
パ*ターン引数を使用して、自分の引数 (整数、バイナリデータ、または ASCII 文字列) のタイプに一致する API 呼び出しを追加します。特に、tt_pattern_iarg_add() の NULL のワイルドカード値を使ってパターン引数を加えることはできないので注意してください。NULL つまり 0 は、有効な整数の引数であるためです。ワイルドカードの引数を加えるには、tt_pattern_arg_add() を使用してください。
ユーザーアプリケーションのインスタンスが動作していない場合、処置属性で、そのアプリケーションに送られたメッセージの処理方法を ToolTalk サービスに指示します。
パターンの静的型定義で指定した処置の値がデフォルトになりますが、メッセージの処置でハンドラの ptype を指定すると、このデフォルトは上書きされます。たとえば、「Display」というメッセージシグニチャの入った「UWriteIt」という
ptype に対して、メッセージの処置で静的型定義を指定するとします。このメッセージシグニチャは、そのパターンのどの静的シグニチャとも一致しないため、ToolTalk
サービスはそのメッセージ中に設定された処置に従います。たとえば、メッセージの処置が TT_START
で、「UWriteIt」という ptype で開始文字列を指定すると、ToolTalk サービスはアプリケーションのインスタンスが
1 つも動作していない場合、アプリケーションのインスタンスを起動します。