=================================================================== RCS file: /home/cvs/OpenXM/doc/OpenXM-specs/OX-RFC-101.tex,v retrieving revision 1.2 retrieving revision 1.6 diff -u -p -r1.2 -r1.6 --- OpenXM/doc/OpenXM-specs/OX-RFC-101.tex 2000/11/30 08:46:23 1.2 +++ OpenXM/doc/OpenXM-specs/OX-RFC-101.tex 2000/12/05 23:19:49 1.6 @@ -1,5 +1,5 @@ %#!make OX-RFC-101-ja.dvi -% $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-101.tex,v 1.1 2000/11/30 02:41:36 takayama Exp $ +% $OpenXM: OpenXM/doc/OpenXM-specs/OX-RFC-101.tex,v 1.5 2000/12/05 06:38:55 ohara Exp $ \documentclass{article} %%\IfFileExists{epsfig.sty}{\usepackage{epsfig}}{} \usepackage{html} @@ -50,10 +50,10 @@ oxc の導入により、いままでのサーバの起動手順はコントロ 計算サーバの起動に分離される。コントロールサーバを起動するには次の手順を 取る。まず、適当なオプション(後述)をつけて、コントロールサーバを起動する と、コントロールサーバはソケットを作成し、connect する。クライアントは、 -listen, accept する。接続後、バイトオーダを決定する。バイトオーダの決定 -方法については、従来のものと変更はない。 -OpenXM/doc/OpenXM-specs/control.tex を見よ。その後、コントロールサーバは -待機状態にはいる。コントロールサーバは OpenXM スタックマシンであるから、 +listen, accept する。接続後、最初にバイトオーダを決定する。バイトオーダ +の決定方法については、従来のものと変更はない +(OpenXM/doc/OpenXM-specs/control.tex を見よ)。その後、コントロールサーバ +は待機状態にはいる。コントロールサーバは OpenXM スタックマシンであるから、 mathcap の交換などの手続きに入ってもよい。 \subsection{OpenXM control stack machine} @@ -66,7 +66,7 @@ mathcap の交換などの手続きに入ってもよい。 \begin{verbatim} SM_control_spawn_server \end{verbatim} -新たに計算サーバを起動する。サーバの起動に成功すると、その ID を返す。 +新たに計算サーバを起動する。計算サーバの起動に成功すると、その ID を返す。 Request: \begin{tabular}{|c|c|} \hline @@ -76,7 +76,7 @@ Request: Stack before the request: \begin{tabular}{|c|c|} \hline -{\sl Integer32} Port & {\sl String} ServerName \\ +{\sl List} Argument \\ \hline \end{tabular} @@ -88,6 +88,18 @@ Stack after the request: Output: none. +Argument: +\begin{tabular}{|c|c|c|} \hline +{\sl List} Ports & {\sl String} ServerName & ...\\ +\hline +\end{tabular} + +Ports: +\begin{tabular}{|c|c|} \hline +{\sl Integer32} Port & ... \\ +\hline +\end{tabular} + \item \begin{verbatim} SM_control_terminate_server @@ -161,15 +173,73 @@ Output: none. \bigskip \bigskip +\subsection{OpenXM reset protocol} +OX-RFC-100 に準拠する。 + \subsection{A sample implementation} \subsubsection{Command Line Arguments} -コントロールサーバの実行形式は getopt(1) に ``c:p:h:x'' で指定するオプショ +コントロールサーバの実行形式は getopt(3) に ``c:p:h:x'' で指定するオプショ ンを持つ。すなわち、 \begin{verbatim} oxc -c [password] -h [hostname] -p [portnumber] -x \end{verbatim} +{\tt -h} では、クライアントのホスト名を指定する。クライアントはあらかじめ、 +hostname:port を開いて待ち受けなければならない。 + +{\tt -x} オプションはなくてもよい。-x を指定し、かつ環境変数 DISPLAY が +設定されていると、oxc は新たに端末(ウィンドウ)を作成して、メッセージをそ +の端末に出力する。oxc の用いる端末の種類は環境変数OpenXM\_XTERM で指定す +る。デフォルトは xterm である。 + +オプション {\tt -h} が指定されないときには特別な動作を行う。 + +\subsubsection{パイプを利用した接続} + +oxc はオプション {\tt -h} が指定されないときには、コマンドラインで与えら +れるべき情報を、標準入力から得ようとする。ここでは、この機能について説明 +する。まず、標準入力から受け取るデータは次の形式をしていなければならない。 +\begin{tabular}{|c|c|c|c|c|} +\hline +{\sl int32} port & {\sl String} hostname & {\sl byte} 0 & {\sl String} password & {\sl byte} 0\\ +\hline +\end{tabular} + +\medskip + +String は C のストリングではなくて、cmo\_string のような、長さ付きの +ストリングである。 + +\noindent +データの例: \\ +port = 1324 = 0x052c, hostname = ``orange'', password = ``hogehoge'' +の場合 +\begin{verbatim} +00 00 05 2c 00 00 00 07 6f 72 61 6e 67 65 00 00 +00 00 09 68 6f 67 65 68 6f 67 65 00 +\end{verbatim} + +さて具体的な起動プロセスは次の通りである。 + +\begin{enumerate} +\item +クライアントは pipe(2) を用いて、ファイルディスクリプタ fd0, fd1 を +手にいれる。 +\item +fork(2) で子プロセスを生成し、子プロセスは dup2(fd1, 0) を実行する。 +これで 親プロセスの fd0 と子プロセスの 0 が接続されている。 +\item +子プロセスは exec("ssh remotehost controlserver") としてリモートプロセ +ス起動する。このとき、親プロセスの fd0 とリモートプロセスの 0 が接続さ +れている。 +\item +この通信路はリモートプロセスからは標準入力として見えている。 +リモートプロセスは標準入力から既に述べたフォーマットにしたがってデータを +読み込む。リモートプロセスは、そのデータを用いて connect(2) を実行する。 +\end{enumerate} + + \subsubsection{Local Functions} コントロールサーバの各実装は、独自にローカル関数をサポートしてもよい。 @@ -177,14 +247,14 @@ oxc -c [password] -h [hostname] -p [portnumber] -x ここでは、oxc のローカル関数 spawn について説明しよう。 -spawn は計算サーバを起動し、少なくとも 2 個の引数を持つ。すなわち、 -\begin{verbatim} -spawn(計算サーバ名, ポート番号, モード, ...) -\end{verbatim} -という形式である。「モード」はなくてもよい。ここで、「計算サーバ名」は -CMO\_STRING 型のオブジェクト、「ポート番号」、「モード」は CMO\_INT32型 -のオブジェクトである。ローカル関数の実行は SM\_executeFunction による。 -すなわち各引数を順にスタックに積み、最後にSM\_executeFunction を実行する。 +spawn は計算サーバを起動し、少なくとも 1 個の引数を持つ。この引数は +SM\_control\_spawn\_server で用いられる {\sl List} Argument と同一の形式で +ある。すなわち、スタックに(右がトップ) +\begin{tabular}{|c|c|c|} \hline +{\sl List} Argument & {\sl Integer32} 1 & {\sl String} ``spawn'' \\ +\hline +\end{tabular} +を積み、SM\_executeFunction をコントローラに送る。 SM\_executeStringByLocalParser は利用できないので注意する。 spawn は、計算サーバの起動に成功したら (CMO\_INT32, サーバID) を、失 @@ -192,7 +262,6 @@ spawn は、計算サーバの起動に成功したら (CMO\_INT32, サ かった場合にはエラーオブジェクトを積むことになる。コントロールサーバは access(2) を用いて PATH から計算サーバを探す。もし見つからなければ、fork をせずに、エラーオブジェクトをスタックに積む。 - */ /*&eg