rpcgen - RPC
プロトコルコンパイラ
rpcgen infile
rpcgen [-D name[=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
ディスパッチテーブルのエントリには以下のものがある。
- •
- その手続きに対応するサービスルーチンへのポインタ
- •
- 入出力引き数へのポインタ
- •
- これらのルーチンのサイズ
サーバは、認証をチェックした後にサービスルーチンを実行するために、
ディスパッチテーブルを使うことができる。
クライアントライブラリは、記憶領域管理と
XDR
データ変換を詳細に扱うために、
ディスパッチテーブルを使うことができる。
上で示した他の 3
つの書式は、
全ての出力ファイルではなく、特定の
1
つのファイルが必要な場合に使われる。
いくつかの使用例が以下の「例」のセクションで説明されている。
rpcgen が -s
オプション付きで実行された場合、
特定クラスのトランスポート用のサーバを生成する。
-n
オプション付きで実行された場合、
netid
で指定したトランスポート用のサーバを生成する。
infile
が指定されていない場合、
rpcgen
は標準入力から入力を受け付ける。
入力ファイルが rpcgen
によって実際に処理される前に、C
プリプロセッサ cc -E [
cc(1)
を参照]
が実行される。 rpcgen
は各タイプの出力ファイルに対して、
rpcgen
プログラマが使う特別なプリプロセッサシンボルを定義する。
- RPC_HDR
- ヘッダファイルにコンパイルする際に定義される。
- RPC_XDR
- XDR
ルーチンにコンパイルする際に定義される。
- RPC_SVC
- サーバ側スタブにコンパイルする際に定義される。
- RPC_CLNT
- クライアント側スタブにコンパイルする際に定義される。
- RPC_TBL
- RPC
ディスパッチテーブルにコンパイルする際に定義される。
`%'
で始まる全ての行は、
rpcgen
に解釈されることなく、出力ファイルに直接そのまま渡される。
infile
で参照される全てのデータタイプに対して、
rpcgen
はデータタイプ名の前に
xdr_
を付けた名前のルーチンが存在することを仮定する。
このルーチンが RPC/XDR
ライブラリにない場合、
そのルーチンを提供しなければならない。
未定義のデータタイプを提供することで
XDR
ルーチンをカスタマイズすることができる。
以下のオプションが使用可能である。
- -a
- クライアント側とサーバ側のサンプルコードを含む全てのファイルを生成する。
- -b
- SunOS4.1 スタイルの RPC
コードを生成する。
昔のコードとの互換性のためにある。これがデフォルトである。
- -5
- SysVr4 スタイルの RPC
コードを生成する。
これは Svr4
システムのトランスポート独立
RPC (Transport Independent RPC)
で使われる。
デフォルトでは rpcgen
は、SunOS4.1 スタイルの RPC
コードを生成する。
- -c
- コンパイルして
XDR
ルーチンを生成する。
- -C
- ANSI C
のコードを生成する。
このオプションは C++
コンパイラでもコンパイルできるコードを生成する。
これがデフォルトである。
- -k
- K&R C
のコードを生成する。デフォルトは
ANSI C である。
- -Dname[=value]
- シンボル name
を定義する。
ソース中の #define
ディレクティブと同じ。
value
が与えられていない場合、
value は 1
と定義される。
このオプションは複数回指定してもよい。
- -h
- コンパイルして C
言語のデータ定義
(ヘッダファイル)
を生成する。 RPC
ディスパッチテーブルをサポートするヘッダファイルを生成したい場合は、
-T
オプションを同時に指定すること。
- -I
- inetd
から起動できるサービスを生成する。
デフォルトでは、-s
オプションで選択されるトランスポートを処理する、
静的サービスを生成する。
-I
を使うことで、サービスをどちらの方法でも起動できるようになる。
- -K secs
- デフォルトでは、rpcgen
で生成されたサービスは、
リクエストを処理した後
120
秒待って終了する。
この待機時間は -K
フラグを使って変更できる。
リクエストを処理した後すぐに終了するサーバを生成するには、
-K 0
を指定すること。
決して終了しないサーバを生成するには、
適切な引き数である
-K -1
を指定すること。
- サーバをモニタリングしている場合、ある種のポートモニタ、例えば
listen(1M)
のようなものは、サービスリクエストに応答して
常に
新しいプロセスを生成する。
サーバがそのようなモニタとともに使われることが分かっている場合、
サーバは処理の完了後すぐに終了すべきである。
そのようなサーバを生成するためには、
rpcgen を -K -1
オプション付きで使うべきである。
- -l
- コンパイルしてクライアント側スタブを生成する。
- -m
- コンパイルしてサーバ側スタブファイルを生成するが、
“main”
ルーチンは作成しない。
このオプションは、コールバックルーチンを作成する場合や、
初期化を行うために独自の
“main”
ルーチンを記述する必要がある
ユーザーにとって役に立つ。
- -n netid
- コンパイルして
netid
で指定したトランスポート用のサーバ側スタブを生成する。
netconfig データベースに
netid
用のエントリが存在する必要がある。
複数のトランスポートに対してサービスを行うサーバを作成するために、
このオプションを複数回指定することができる。
- -N
- 新しいスタイルの
rpcgen
を使う。手続きが複数の引き数を持てるようにする。
これはまた、C
言語にとてもよく似たパラメータ渡しの方法を用いる。
これにより、遠隔手続きに引き数を渡す場合に、引き数へのポインタではなく
引き数そのものを渡すことができる。
この動作は、以前のスタイルの
rpcgen
が生成したコードによるものとは異なる。
以前のものとの互換性のため、新しいスタイルはデフォルトになっていない。
- -o outfile
- 出力ファイル名を指定する。
何も指定されない場合、標準出力に書き出す
(-c, -h, -l, -m, -n, -s, -Sc, -Ss, -t
モード時のみ)。
- -s nettype
- コンパイルして
nettype
クラスに属する全てのトランスポート用のサーバ側スタブを生成する。
サポートされているクラスは以下の通りである。
netpath, visible, circuit_n, circuit_v, datagram_n, datagram_v, tcp, udp
[これらのクラスに関連づけられた意味については、
rpc(3N) を参照すること]。
このオプションは複数回指定することができる。
注意:
トランスポートはコンパイル時ではなく実行時に選択される。
- -Sc
- 遠隔手続きの使用法と、rpcgen
で生成されたクライアント側スタブを
呼び出す前にサーバをバインドする方法を説明するサンプルコードを生成する。
- -Ss
- サーバ側遠隔手続きの骨組みとなるコードを生成する。
遠隔手続きの実際のコードを記述する必要がある。
- -t
- コンパイルして
RPC
ディスパッチテーブルを生成する。
- -T
- RPC
ディスパッチテーブルをサポートするコードを生成する。
オプション -c, -h, -l, -m, -s, -t
は、特定のタイプのファイルを生成するために、どれか
1 つを単独で使う。
一方、オプション -D と
-T
は、グローバルオプションで、他のオプションとともに使うことができる。
RPC
言語は構造体の入れ子構造をサポートしない。
対処法として
同様の効果を得るために、構造体をトップレベルで宣言し、
その構造体名を他の構造体の中で使うことができる。
明確な名前スコープが実際に適応されていないため、
プログラム定義の使用中に名前の衝突が起きる場合がある。
この問題の大部分は、プログラム・バージョン・手続き・タイプに対して
固有の名前を付けることで回避できる。
-n
オプションで生成されたサーバ用コードは、
netid
で指定されたトランスポートを参照するので、
非常にサイト依存したものになる。
以下の例:
- $ rpcgen -T prot.x
は 5 つのファイル: prot.h,
prot_clnt.c, prot_svc.c, prot_xdr.c, prot_tbl.i
を生成する。
以下の例では、C
言語のデータ定義
(ヘッダファイル)
が標準出力に送られる。
- $ rpcgen -h prot.x
datagram_n
クラスに属する全トランスポート用のサーバ側スタブのテストバージョン
-DTEST
を標準出力に書き出すためには、以下のようにすること:
- $ rpcgen -s datagram_n -DTEST prot.x
netid tcp
で指定されたトランスポート用のサーバ側スタブを生成するためには、
以下のようにすること:
- $ rpcgen -n tcp -o prot_svc.c prot.x
cc(1)
この man
ページの翻訳にあたり、
FreeBSD jpman project <
http://www.jp.freebsd.org/man-jp/>
による翻訳を参考にさせていただいた。