EN JA
rpcgen(1)
rpcgen(1) FreeBSD General Commands Manual rpcgen(1)

名前

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 である。
-D name[= 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/>による翻訳を参考にさせていただいた。