rpcgen

RPC プロトコルコンパイラ

\f4rpcgen\f1 - RPC プロトコルコンパイラ
4
rpcgen \f2infile\f4
1 4
rpcgen [-D\f2name\f4[=\f2value\f4]] [-T] [-K \f2secs] \f2infile\f4
1 4
rpcgen -c|-h|-l|-m|-t [-o \f2outfile\f4 ] \f2infile\f4
1 4
rpcgen [-I] -s \f2nettype\f4 [-o \f2outfile\f4] \f2infile\f4
1 4
rpcgen -n \f2netid\f4 [-o \f2outfile\f4] \f2infile\f4
1

    
\f4rpcgen\f1 は RPC プロトコルを実装する C 言語のコードを生成するツールである。 \f4rpcgen\f1 への入力は RPC 言語 (遠隔手続き呼び出し言語 Remote Procedure Call Language) として知られる C 言語に似た言語である。 \f4rpcgen\f1 は通常、1 つの入力ファイルを受け取って 4 つの出力ファイルを生成する、 第 1 の書式で使われる。 入力ファイル \f2infile\f1 が \f4proto.x\f1 という名前である場合、 \f4rpcgen\f1 はヘッダファイル \f4proto.h\f1、 XDR ルーチン \f4proto_xdr.c\f1、 サーバ側スタブ \f4proto_svc.c\f1、 クライアント側スタブ \f4proto_clnt.c\f1 を生成する。 \f4-T\f1 オプションを指定すると、さらに RPC ディスパッチテーブル n\f4proto_tbl.i\f1 も生成する。 \f4-Sc\f1 オプションを指定すると、クライアント側での遠隔手続きの使用法を説明する サンプルコードも生成する。 このコードは \f4proto_client.c\f1 に書き出される。 \f4-Ss\f1 オプションを指定すると、 遠隔手続きの書き方を説明するサンプルのサーバ用コードを生成する。 このコードは \f4proto_server.c\f1 に書き出される。 生成されたサーバは、 ポートモニタ (例えば \f4inetd\f1 や \f4listen\f1) で起動することも、 それ自身で起動することもできる。 ポートモニタで起動される場合、 ファイルディスクリプタ \f40 を引き渡すトランスポートのためだけの サーバを生成する。 トランスポートの名前は環境変数 \f4PM_TRANSPORT\f1 を設定することで指定しなければならない。 \f4rpcgen\f1 で作成されたサーバが実行されると、 サーバは環境変数 \f4NETPATH\f1 で指定された全てのトランスポート用にサーバハンドルを生成する。 環境変数 \f4NETPATH\f1 が設定されていない場合、 \f4/etc/netconfig\f1 ファイルに記述された全ての可視トランスポート用にサーバハンドルを生成する。 注意: トランスポートはコンパイル時ではなく実行時に選択される。 サーバが自分自身で開始する場合、 デフォルトではバックグラウンド実行に移る。 サーバプロセスをフォアグラウンドで実行するには、 特殊定義シンボル \f4RPC_SVC_FG\f1 が使われる。 第 2 の書式は、より洗練された RPC サーバを生成する特別な機能を提供する。 これらの機能には、ユーザー定義の \f4#define\f1 と RPC ディスパッチテーブルのサポートが含まれる。 RPC ディスパッチテーブルのエントリには以下のものがある。
bu
その手続きに対応するサービスルーチンへのポインタ
bu
入出力引き数へのポインタ
bu
これらのルーチンのサイズ サーバは、認証をチェックした後にサービスルーチンを実行するために、 ディスパッチテーブルを使うことができる。 クライアントライブラリは、記憶領域管理と XDR データ変換を詳細に扱うために、 ディスパッチテーブルを使うことができる。 上で示した他の 3 つの書式は、 全ての出力ファイルではなく、特定の 1 つのファイルが必要な場合に使われる。 いくつかの使用例が以下の「例」のセクションで説明されている。 \f4rpcgen\f1 が \f4-s\f1 オプション付きで実行された場合、 特定クラスのトランスポート用のサーバを生成する。 \f4-n\f1 オプション付きで実行された場合、 \f2netid\f1 で指定したトランスポート用のサーバを生成する。 \f2infile\f1 が指定されていない場合、 \f4rpcgen\f1 は標準入力から入力を受け付ける。 入力ファイルが \f4rpcgen\f1 によって実際に処理される前に、C プリプロセッサ \f4cc -E\f1 [\f4cc(1) を参照] が実行される。 \f4rpcgen\f1 は各タイプの出力ファイルに対して、 \f4rpcgen\f1 プログラマが使う特別なプリプロセッサシンボルを定義する。
\f4RPC_HDR\f1
ヘッダファイルにコンパイルする際に定義される。
\f4RPC_XDR\f1
XDR ルーチンにコンパイルする際に定義される。
\f4RPC_SVC\f1
サーバ側スタブにコンパイルする際に定義される。
\f4RPC_CLNT\f1
クライアント側スタブにコンパイルする際に定義される。
\f4RPC_TBL\f1
RPC ディスパッチテーブルにコンパイルする際に定義される。 `\f4%\f1' で始まる全ての行は、 \f4rpcgen\f1 に解釈されることなく、出力ファイルに直接そのまま渡される。 \f2infile\f1 で参照される全てのデータタイプに対して、 \f4rpcgen\f1 はデータタイプ名の前に \f4xdr_\f1 を付けた名前のルーチンが存在することを仮定する。 このルーチンが RPC/XDR ライブラリにない場合、 そのルーチンを提供しなければならない。 未定義のデータタイプを提供することで XDR ルーチンをカスタマイズすることができる。 10 以下のオプションが使用可能である。
\f4-a\f1
クライアント側とサーバ側のサンプルコードを含む全てのファイルを生成する。
\f4-b\f1
SunOS4.1 スタイルの RPC コードを生成する。 昔のコードとの互換性のためにある。これがデフォルトである。
\f4-5\f1
SysVr4 スタイルの RPC コードを生成する。 これは Svr4 システムのトランスポート独立 RPC (Transport Independent RPC) で使われる。 デフォルトでは rpcgen は、SunOS4.1 スタイルの RPC コードを生成する。
\f4-c\f1
コンパイルして XDR ルーチンを生成する。
\f4-C\f1
ANSI C のコードを生成する。 このオプションは C++ コンパイラでもコンパイルできるコードを生成する。 これがデフォルトである。
\f4-k\f1
K&R C のコードを生成する。デフォルトは ANSI C である。
\f4-D\f2name\f4[=\f2value\f4]\f1
シンボル \f2name\f1 を定義する。 ソース中の \f4#define\f1 ディレクティブと同じ。 \f2value\f1 が与えられていない場合、 \f2value\f1 は \f41\f1 と定義される。 このオプションは複数回指定してもよい。
\f4-h\f1
コンパイルして \f4C\f1 言語のデータ定義 (ヘッダファイル) を生成する。 RPC ディスパッチテーブルをサポートするヘッダファイルを生成したい場合は、 \f4-T\f1 オプションを同時に指定すること。
\f4-I\f1
inetd から起動できるサービスを生成する。 デフォルトでは、\f4-s\f1 オプションで選択されるトランスポートを処理する、 静的サービスを生成する。 \f4-I\f1 を使うことで、サービスをどちらの方法でも起動できるようになる。
\f4-K\f2 secs\f1
デフォルトでは、\f4rpcgen で生成されたサービスは、 リクエストを処理した後 \f4120 秒待って終了する。 この待機時間は \f4-K フラグを使って変更できる。 リクエストを処理した後すぐに終了するサーバを生成するには、 \f4-K 0 を指定すること。 決して終了しないサーバを生成するには、 適切な引き数である \f4-K -1 を指定すること。 サーバをモニタリングしている場合、ある種のポートモニタ、例えば \f4listen(1M) のようなものは、サービスリクエストに応答して 常に 新しいプロセスを生成する。 サーバがそのようなモニタとともに使われることが分かっている場合、 サーバは処理の完了後すぐに終了すべきである。 そのようなサーバを生成するためには、 \f4rpcgen を \f4-K -1 オプション付きで使うべきである。
\f4-l\f1
コンパイルしてクライアント側スタブを生成する。
\f4-m\f1
コンパイルしてサーバ側スタブファイルを生成するが、 lqmainrq ルーチンは作成しない。 このオプションは、コールバックルーチンを作成する場合や、 初期化を行うために独自の lqmainrq ルーチンを記述する必要がある ユーザーにとって役に立つ。
\f4-n \f2netid\f1
コンパイルして \f2netid\f1 で指定したトランスポート用のサーバ側スタブを生成する。 netconfig データベースに \f2netid\f1 用のエントリが存在する必要がある。 複数のトランスポートに対してサービスを行うサーバを作成するために、 このオプションを複数回指定することができる。
\f4-N\f1
新しいスタイルの rpcgen を使う。手続きが複数の引き数を持てるようにする。 これはまた、C 言語にとてもよく似たパラメータ渡しの方法を用いる。 これにより、遠隔手続きに引き数を渡す場合に、引き数へのポインタではなく 引き数そのものを渡すことができる。 この動作は、以前のスタイルの rpcgen が生成したコードによるものとは異なる。 以前のものとの互換性のため、新しいスタイルはデフォルトになっていない。
\f4-o \f2outfile\f1
出力ファイル名を指定する。 何も指定されない場合、標準出力に書き出す (\f4-c\f1, \f4-h\f1, \f4-l\f1, \f4-m\f1, \f4-n\f1, \f4-s\f1, \f4-Sc\f1, \f4-Ss\f1, \f4-t\f1 モード時のみ)。
\f4-s \f2nettype\f1
コンパイルして \f2nettype\f1 クラスに属する全てのトランスポート用のサーバ側スタブを生成する。 サポートされているクラスは以下の通りである。 \f4netpath\f1, \f4visible\f1, \f4circuit_n\f1, \f4circuit_v\f1, \f4datagram_n\f1, \f4datagram_v\f1, \f4tcp\f1, \f4udp\f1 [これらのクラスに関連づけられた意味については、 \f4rpc(3N) を参照すること]。 このオプションは複数回指定することができる。 注意: トランスポートはコンパイル時ではなく実行時に選択される。
\f4-Sc\f1
遠隔手続きの使用法と、rpcgen で生成されたクライアント側スタブを 呼び出す前にサーバをバインドする方法を説明するサンプルコードを生成する。
\f4-Ss\f1
サーバ側遠隔手続きの骨組みとなるコードを生成する。 遠隔手続きの実際のコードを記述する必要がある。
\f4-t\f1
コンパイルして RPC ディスパッチテーブルを生成する。
\f4-T\f1
RPC ディスパッチテーブルをサポートするコードを生成する。 オプション \f4-c\f1, \f4-h\f1, \f4-l\f1, \f4-m\f1, \f4-s\f1, \f4-t\f1 は、特定のタイプのファイルを生成するために、どれか 1 つを単独で使う。 一方、オプション \f4-D\f1 と \f4-T\f1 は、グローバルオプションで、他のオプションとともに使うことができる。 5
RPC 言語は構造体の入れ子構造をサポートしない。 対処法として 同様の効果を得るために、構造体をトップレベルで宣言し、 その構造体名を他の構造体の中で使うことができる。 明確な名前スコープが実際に適応されていないため、 プログラム定義の使用中に名前の衝突が起きる場合がある。 この問題の大部分は、プログラム・バージョン・手続き・タイプに対して 固有の名前を付けることで回避できる。 \f4-n\f1 オプションで生成されたサーバ用コードは、 \f2netid\f1 で指定されたトランスポートを参照するので、 非常にサイト依存したものになる。
以下の例: 4 $ rpcgen -T prot.x 1 は 5 つのファイル: \f4prot.h\f1, \f4prot_clnt.c\f1, \f4prot_svc.c\f1, \f4prot_xdr.c\f1, \f4prot_tbl.i\f1 を生成する。 以下の例では、C 言語のデータ定義 (ヘッダファイル) が標準出力に送られる。 4 $ rpcgen -h prot.x 1 \f4datagram_n\f1 クラスに属する全トランスポート用のサーバ側スタブのテストバージョン \f4-DTEST\f1 を標準出力に書き出すためには、以下のようにすること: 4 $ rpcgen -s datagram_n -DTEST prot.x 1 \f2netid\f1 \f4tcp\f1 で指定されたトランスポート用のサーバ側スタブを生成するためには、 以下のようにすること: 4 $ rpcgen -n tcp -o prot_svc.c prot.x 1
\f4cc(1)
この man ページの翻訳にあたり、 FreeBSD jpman project <http://www.jp.freebsd.org/man-jp/> による翻訳を参考にさせていただいた。