rpcgen(1) | General Commands Manual | rpcgen(1) |
rpcgen - RPC プロトコルコンパイラ
rpcgen infile
rpcgen [-Dname[=value]] [-T] [-K secs] infile
rpcgen -c|-h|-l|-m|-t [-o outfile ] infile
rpcgen [-I] -s nettype [-o outfile] infile
rpcgen -n netid [-o outfile] infile
rpcgen は RPC プロトコルを実装する C 言語のコードを生成するツールである。 rpcgen への入力は RPC 言語 (遠隔手続き呼び出し言語 Remote Procedure Call Language) として知られる C 言語に似た言語である。
rpcgen は通常、1 つの入力ファイルを受け取って 4 つの出力ファイルを生成する、 第 1 の書式で使われる。 入力ファイル infile が proto.x という名前である場合、 rpcgen はヘッダファイル proto.h、 XDR ルーチン proto_xdr.c、 サーバ側スタブ proto_svc.c、 クライアント側スタブ proto_clnt.c を生成する。 -T オプションを指定すると、さらに RPC ディスパッチテーブル nproto_tbl.i も生成する。 -Sc オプションを指定すると、クライアント側での遠隔手続きの使用法を説明する サンプルコードも生成する。 このコードは proto_client.c に書き出される。 -Ss オプションを指定すると、 遠隔手続きの書き方を説明するサンプルのサーバ用コードを生成する。 このコードは proto_server.c に書き出される。
生成されたサーバは、 ポートモニタ (例えば inetd や listen) で起動することも、 それ自身で起動することもできる。 ポートモニタで起動される場合、 ファイルディスクリプタ 0 を引き渡すトランスポートのためだけの サーバを生成する。 トランスポートの名前は環境変数 PM_TRANSPORT を設定することで指定しなければならない。 rpcgen で作成されたサーバが実行されると、 サーバは環境変数 NETPATH で指定された全てのトランスポート用にサーバハンドルを生成する。 環境変数 NETPATH が設定されていない場合、 /etc/netconfig ファイルに記述された全ての可視トランスポート用にサーバハンドルを生成する。 注意: トランスポートはコンパイル時ではなく実行時に選択される。 サーバが自分自身で開始する場合、 デフォルトではバックグラウンド実行に移る。 サーバプロセスをフォアグラウンドで実行するには、 特殊定義シンボル RPC_SVC_FG が使われる。
第 2 の書式は、より洗練された RPC サーバを生成する特別な機能を提供する。 これらの機能には、ユーザー定義の #define と RPC ディスパッチテーブルのサポートが含まれる。 RPC ディスパッチテーブルのエントリには以下のものがある。
上で示した他の 3 つの書式は、 全ての出力ファイルではなく、特定の 1 つのファイルが必要な場合に使われる。 いくつかの使用例が以下の「例」のセクションで説明されている。 rpcgen が -s オプション付きで実行された場合、 特定クラスのトランスポート用のサーバを生成する。 -n オプション付きで実行された場合、 netid で指定したトランスポート用のサーバを生成する。 infile が指定されていない場合、 rpcgen は標準入力から入力を受け付ける。
入力ファイルが rpcgen によって実際に処理される前に、C プリプロセッサ cc -E [cc(1) を参照] が実行される。 rpcgen は各タイプの出力ファイルに対して、 rpcgen プログラマが使う特別なプリプロセッサシンボルを定義する。
`%' で始まる全ての行は、 rpcgen に解釈されることなく、出力ファイルに直接そのまま渡される。
infile
で参照される全てのデータタイプに対して、
rpcgen
はデータタイプ名の前に
xdr_
を付けた名前のルーチンが存在することを仮定する。
このルーチンが RPC/XDR
ライブラリにない場合、
そのルーチンを提供しなければならない。
未定義のデータタイプを提供することで
XDR
ルーチンをカスタマイズすることができる。
以下のオプションが使用可能である。
オプション -c,
-h, -l, -m, -s,
-t
は、特定のタイプのファイルを生成するために、どれか
1 つを単独で使う。
一方、オプション
-D と -T
は、グローバルオプションで、他のオプションとともに使うことができる。
RPC 言語は構造体の入れ子構造をサポートしない。 対処法として 同様の効果を得るために、構造体をトップレベルで宣言し、 その構造体名を他の構造体の中で使うことができる。
明確な名前スコープが実際に適応されていないため、 プログラム定義の使用中に名前の衝突が起きる場合がある。 この問題の大部分は、プログラム・バージョン・手続き・タイプに対して 固有の名前を付けることで回避できる。
-n オプションで生成されたサーバ用コードは、 netid で指定されたトランスポートを参照するので、 非常にサイト依存したものになる。
以下の例:
は 5 つのファイル: prot.h, prot_clnt.c, prot_svc.c, prot_xdr.c, prot_tbl.i を生成する。
以下の例では、C 言語のデータ定義 (ヘッダファイル) が標準出力に送られる。
datagram_n クラスに属する全トランスポート用のサーバ側スタブのテストバージョン -DTEST を標準出力に書き出すためには、以下のようにすること:
netid tcp で指定されたトランスポート用のサーバ側スタブを生成するためには、 以下のようにすること:
cc(1)
この man ページの翻訳にあたり、 FreeBSD jpman project <http://www.jp.freebsd.org/man-jp/> による翻訳を参考にさせていただいた。