rpcgen - RPC プロトコルコンパイラ
rpcgen infile
rpcgen [-a] [-A] [-b] [-C] [-D name [= value]] [-i size] [-I [-K seconds]] [-L] [-M] [-N] [- T] [-v] [-Y pathname] infile
rpcgen [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile]
rpcgen [-s nettype] [-o outfile] [infile]
rpcgen [-n netid] [-o outfile] [infile]
rpcgen ユーティリティーは、RPC プロトコルを実装するための C コードを生成するツールです。rpcgen への入力は、RPC 言語 (Remote Procedure Call Language) として知られる C に似た言語です。
通常、rpcgen ユーティリティーは最初の形式内で使用され、そこで 1 つの入力ファイルを受け取って 3 つの出力ファイルを生成します。infile の名前が proto.x である場合、rpcgen はヘッダーを proto.h 内に、 XDR ルーチンを proto_xdr.c 内に、サーバー側スタブを proto_svc.c 内に、クライアント側スタブを proto_clnt.c 内に生成します。–T オプションが指定されると、RPC ディスパッチテーブルも proto_tbl.i 内に生成します。
rpcgen は、特定のアプリケーションに合わせてカスタマイズ可能なサンプルのクライアントおよびサーバーファイルも生成できます。–Sc、–Ss、および –Sm オプションは、それぞれサンプルのクライアント、サーバー、およびメイクファイルを生成します。–a オプションは、サンプルファイルを含むすべてのファイルを生成します。入力ファイルが proto.x である場合、クライアント側のサンプルファイルは proto_client.c に、サーバー側のサンプルファイルは proto_server.c に、サンプルのメイクファイルは makefile.proto にそれぞれ書き込まれます。
作成されたサーバーは、ポートモニター (inetd など) によって開始することも、単独で開始することもできます。ポートモニターで開始した場合、作成されるのは、ファイル記述子 0 が渡されたトランスポート専用のサーバーです。トランスポートの名前を指定するには、環境変数 PM_TRANSPORT を設定する必要があります。rpcgen により生成されたサーバーは、実行時に、NETPATH 環境変数内で指定されたすべてのトランスポートのサーバーハンドルを作成するか、この環境変数が設定されていない場合は /etc/netconfig ファイルからのすべての可視トランスポートのサーバーハンドルを作成します。注: トランスポートは、コンパイル時ではなく、実行時に選択されます。サーバーが自己起動する場合、デフォルトで自らをバックグランドで実行します。特殊定義シンボル RPC_SVC_FG を使用して、サーバープロセスをフォアグラウンドで実行できます。
2 番目の形式は、より高度な RPC サーバーの作成を可能にする特殊機能を提供します。これらの機能には、ユーザー指定の #defines および RPC ディスパッチテーブルのサポートが含まれています。RPC ディスパッチテーブル内のエントリには、次が含まれます。
そのプロシージャーに対応するサービスルーチンへのポインタ
入力および出力引数へのポインタ
これらのルーチンのサイズ
サーバーは、ディスパッチテーブルを使用して承認をチェックしてから、サービスルーチンを実行します。クライアントライブラリは、ディスパッチテーブルを使用して、ストレージ管理および XDR データ変換の詳細を処理できます。
前述のほかの 3 つの形式は、すべての出力ファイルではなく、特定の出力ファイルのみを生成する場合に使用します。rpcgen の使用例については、下記の「使用例」のセクションを参照してください。–s オプションを指定して rpcgen を実行すると、特定のトランスポートクラス用のサーバーが作成されます。–n オプションを指定して実行すると、netid で指定されたトランスポート用のサーバーが作成されます。infile が指定されていない場合、rpcgen は標準入力を受け入れます。
2 番目の形式に記載されているすべてのオプションは、ほかの 3 つの形式で使用できますが、変更は指定された出力ファイルにのみ加えられます。
入力ファイルは、C プリプロセッサ cc –E で実行されてから、rpcgen により実際に解釈されます。rpcgen は、出力ファイルのタイプごとに、rpcgen プログラマにより使用される特別なプリプロセッサシンボルを定義します。
ヘッダー内へのコンパイル時に定義されます
XDR ルーチン内へのコンパイル時に定義されます
サーバー側スタブ内へのコンパイル時に定義されます
クライアント側スタブ内へのコンパイル時に定義されます
RPC ディスパッチテーブル内へのコンパイル時に定義されます
「%」で始まる行は、先頭の「%」が削除されるのを除き、rpcgen で解釈されずに出力ファイルに直接渡されます。C プリプロセッサのパス名を指定するには、–Y フラグを使用します。
infile 内で参照されるデータ型の場合、rpcgen は、データ型の名前に文字列 xdr_ が付加されたルーチンが存在するものと見なします。このルーチンが RPC/XDR ライブラリに存在しない場合には、指定する必要があります。未定義のデータ型を指定すると、XDR ルーチンのカスタマイズが可能になります。
デフォルトでは、proto_svc.c により検出されたエラーが標準エラーまたはシステムログ、あるいはその両方に報告されます。
この動作は、RPC_MSGOUT の定義を使ってファイルをコンパイルすることでオーバーライドできます (例: -DRPC_MSGOUT=mymsgfunc)。指定された関数は、エラーを報告するために呼び出されます。次の printf のような署名に準拠している必要があります。
extern void RPC_MSGOUT(const char *fmt, ...);
サポートしているオプションは、次のとおりです。
サンプルファイルを含むすべてのファイルを生成します。
サーバーのメインプログラム内で自動 MT モードを有効にします。このモードでは、RPC ライブラリは、クライアントの要求を処理してスレッドを自動的に作成します。このオプションは、–M オプションを暗黙的にオンにすることで、マルチスレッドセーフのスタブを生成します。サーバーのマルチスレッドモードおよびパラメータは、rpc_control(3NSL) 呼び出しを使用して設定できます。rpcgen で生成されたコードは、自動 MT モードのデフォルト値を変更しません。
下位互換性モード。以前のバージョンのオペレーティングシステム用のトランスポート固有 RPC コードを生成します。
XDR ルーチン内にコンパイルします。
ANSI C コンパイラで使用可能なヘッダーおよびスタブファイルを生成します。このフラグを使用して生成されたヘッダーは、C++ プログラムでも使用できます。
シンボルの name を定義します。ソース内の #define 指令と同等です。value を指定しない場合、value は 1 として定義されます。このオプションは、複数回指定できます。
C データ定義内にコンパイルします (ヘッダー)。–T オプションを組み合わせて使用して、RPC ディスパッチテーブルをサポートするヘッダーを生成できます。
インラインコードの生成を開始するサイズ。このオプションは、最適化に役立ちます。デフォルトの size は 5 です。
サーバー側スタブ内で inetd(1M) のサポートをコンパイルします。この種のサーバーは、自己起動可能であるか、inetd で開始できます。サーバーが自己起動する場合、デフォルトで自らをバックグランドで実行します。特殊定義シンボル RPC_SVC_FG を使用してサーバープロセスをフォアグラウンドで実行することも、ユーザーが –I オプションなしで単純にコンパイルすることもできます。
保留中のクライアント要求が存在しない場合、inetd サーバーは 120 秒後に終了します (デフォルト)。デフォルトは、–K オプションを使って変更できます。inetd サーバーのすべてのエラーメッセージは、常に syslog(3C) を使用して記録されます。
注: このオプションは、下位互換性のためだけにサポートされています。これは必ず、下位互換性コードを生成する –b オプションと組み合わせて使用してください。デフォルトでは (つまり –b が指定されていない場合)、rpcgen はポートモニターによって呼び出すことができるサーバーを生成します。
デフォルトでは、rpcgen を使用して作成され、ポートモニターによって呼び出されたサービスは、要求の処理後 120 秒間待機してから終了します。この間隔は、–K フラグを使用して変更できます。要求を処理するとすぐに終了するサーバーを作成するには、–K 0 を使用します。決して終了しないサーバーを作成する場合、適切な引数は –K -1 です。
サーバーのモニタリング時に、一部のポートモニターは、サービス要求に応答して常に新しいプロセスを生成します。この種のモニターでサーバーが使用されることがわかっている場合は、サーバーは完了するとすぐに終了するべきです。この種のサーバーでは、rpcgen を–K 0 とともに使用するようにしてください。
クライアント側スタブ内にコンパイルします。
サーバーがフォアグラウンドで開始される場合は、標準エラーに出力するのではなく、syslog(3C) を使用してサーバーエラーを記録します。
サーバー側スタブ内にコンパイルしますが、「メイン」ルーチンは生成しません。このオプションは、コールバックルーチンを実行する場合、および初期化を実行するための独自の「メイン」ルーチンを記述する必要のあるユーザーにとって役立ちます。
rpcgen で生成されたコードとユーザーの記述したコードの間で引数および結果を渡すための、マルチスレッドセーフのスタブを生成します。このオプションは、コード内でスレッドを使用するユーザーにとって役立ちます。
このオプションを使用すると、プロシージャーに複数の引数を指定できます。また、C に非常によく似たパラメータ引き渡しスタイルも使用します。このため、引数をリモートプロシージャーに渡す場合、引数へのポインタを渡す必要はなく、引数自体を渡すことができます。この動作は、rpcgen で生成された以前のコードスタイルとは異なります。下位互換性を保つため、このオプションはデフォルトではありません。
netid で指定されたトランスポート用に、サーバー側スタブ内にコンパイルします。netconfig データベース内に netid 用のエントリが存在するはずです。このオプションを複数回指定して、複数のトランスポートを処理するサーバーをコンパイルできます。
出力ファイルの名前を指定します。何も指定しない場合、標準出力が使用されます (–c、–h、–l、–m、–n、–s、–Sc、–Sm、–Ss、および –t モードのみ)。
クラス nettype に属するすべてのトランスポート用に、サーバーサイドスタブ内にコンパイルします。サポートされるクラスは、netpath、visible、circuit_n、circuit_v、datagram_n、 datagram_v、tcp、および udp です (これらのクラスに関連付けられた意味については、rpc(3NSL) を参照)。このオプションは、複数回指定できます。注: トランスポートは、コンパイル時ではなく実行時に選択されます。
リモートプロシージャー呼び出しを使用するサンプルクライアントコードを生成します。
アプリケーションのコンパイルに使用可能なサンプルメイクファイルを生成します。
リモートプロシージャー呼び出しを使用するサンプルサーバーコードを生成します。
RPC ディスパッチテーブル内にコンパイルします。
RPC ディスパッチテーブルをサポートするコードを生成します。
オプション –c、–h、–l、–m、–s、–Sc、–Sm、–Ss、および –t は、特定タイプのファイルを生成するために排他的に使用されますが、オプション –D および – T はグローバルで、ほかのオプションとともに使用できます。
バージョン番号を表示します。
rpcgen が C プリプロセッサの検索を開始するディレクトリの名前を指定します。
次のオペランドを指定できます。
入力ファイル
次に、エントリの例を挙げます。
example% rpcgen -T prot.x
5 つのファイル、prot.h、prot_clnt.c、prot_svc.c、prot_xdr.c、および prot_tbl.i をすべて生成します。
使用例 2 標準出力へのヘッダーの送信次の例では、C データ定義 (ヘッダー) を標準出力に送信します。
example% rpcgen -h prot.x使用例 3 テストバージョンの送信
–DTEST のテストバージョン、クラス datagram_n に属するすべてのトランスポートのサーバー側スタブを標準出力に送信するには、次を使用します。
example% rpcgen -s datagram_n -DTEST prot.x使用例 4 サーバー側スタブの作成
netid tcp により示されるトランスポート用のサーバー側スタブを作成するには、次を使用します。
example% rpcgen -n tcp -o prot_svc.c prot.x
正常終了。
エラーが発生した。
属性についての詳細は、マニュアルページの attributes(5) を参照してください。
|
inetd(1M)、rpc(3NSL)、rpc_control(3NSL)、rpc_svc_calls(3NSL)、syslog(3C)、netconfig(4)、attributes(5)
ONC+ RPC Developer’s Guideの rpcgen に関する章。