名前


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 ディスパッチテーブル n
proto_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 ディスパッチテーブルのエントリには以下のものがある。

o その手続きに対応するサービスルーチンへのポインタ
o 入出力引き数へのポインタ
o これらのルーチンのサイズ

サーバは、認証をチェックした後にサービスルーチンを実行するために、 ディスパッチテーブルを使うことができる。 クライアントライブラリは、記憶領域管理と 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
コンパイルしてサーバ側スタブファイルを生成するが、 \(lqmain\(rq ルーチンは作成しない。 このオプションは、コールバックルーチンを作成する場合や、 初期化を行うために独自の \(lqmain\(rq ルーチンを記述する必要がある ユーザーにとって役に立つ。
-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/> による翻訳を参考にさせていただいた。

openSUSE Logo

コンテンツ