[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

36.3 同期プロセスの作成

同期プロセス(synchronous process)を作成すると、 Emacsは実行を続行するまえにそのプロセスが終了するのを待ちます。 diredはその例です。 lsを同期プロセスで実行し、その出力を少々修正します。 プロセスは同期なので、Emacsがなにかを行おうとするまえに ディレクトリ一覧全部がバッファに届きます。

Emacsは同期サブプロセスの終了を待ちますが、 ユーザーはC-gと打って中断できます。 C-gはまずシグナルSIGINTでサブプロセスをキルしようとしますが、 中断を完了するまえにサブプロセスが終了するのを待ちます。 その期間にユーザーがさらにC-gを打つと、 SIGKILLでサブプロセスを即座にキルし、ただちに中断を完了します。 See section 20.9 中断

同期サブプロセス作成関数は、 そのプロセスがどのように終了したかを表すものを返します。

同期サブプロセスからの出力は、ファイルから読むテキストと同様に、 コーディングシステムを用いて一般には復号化します。 call-process-regionがサブプロセスへ送る入力は、 ファイルへ書くテキストと同様に、 コーディングシステムを用いて符号化します。 See section 32.10 コーディングシステム

Function: call-process program &optional infile destination display &rest args
この関数は、別のプロセスでprogramを呼び出し、 それが終了するのを待つ。

infilenilでなければ プロセスへの標準入力はinfileであるが、 さもなければ`/dev/null'である。 引数destinationでプロセスの出力先をつぎのように指定する。

バッファ
このバッファのポイントのまえに出力を挿入する。 これにはプロセスの標準出力と標準エラーの両者を含む。

文字列
文字列で指定した名前のバッファのポイントのまえに出力を挿入する。

t
カレントバッファのポイントのまえに出力を挿入する。

nil
出力を破棄する。

0
出力を破棄し、サブプロセスの終了を待たずにただちに戻る。

この場合、このプロセスはEmacsと並行して動作するので真のサブプロセスではない。 しかし、この関数から戻るとEmacsはサブプロセスの処理を本質的には終えたと いう意味で同期プロセスと考えることができる。

(real-destination error-destination)
標準出力と標準エラーを分離し、 real-destinationの指定に従って通常の出力を扱い、 error-destinationに従ってエラー出力を処理する。 error-destinationnilであるとエラー出力を破棄し、 tであると通常の出力に混ぜ、 文字列であるとその名前のファイルにエラー出力を振り向ける。

エラー出力を入れるバッファを直接に指定することはできない。 それを実装するのは難しすぎる。 しかし、エラー出力を一時ファイルへ送ってから そのファイルをバッファに挿入すれば、同じ効果を得られる。

displaynil以外であると、call-processは、 出力が挿入されるとバッファを再表示する。 (しかし、コーディングシステムとして実際のデータから コーディングシステムを推定するundecidedを指定していると、 非ASCII文字に出会うと再表示を継続できない場合もある。 これを修正するのが困難である根本的な理由がある。) さもなければ、関数call-processは再表示しないので、 Emacsが通常の過程でそのバッファを再表示するまでは、 スクリーン上で結果は見えない。

残りの引数argsは、プログラムに対する コマンド行引数を指定する文字列である。

(待たないように指示しない限り)call-processが返す値は、 プロセスの終了理由を表す。 数でサブプロセスの終了状態を表し、 0は成功、それ以外の値は失敗を意味する。 プロセスがシグナルで終了すると、 call-processはシグナルを記述する文字列を返す。

つぎの例では、バッファ`foo'がカレントである。

 
(call-process "pwd" nil t)
     => nil

---------- Buffer: foo ----------
/usr/user/lewis/manual
---------- Buffer: foo ----------

(call-process "grep" nil "bar" nil "lewis" "/etc/passwd")
     => nil

---------- Buffer: bar ----------
lewis:5LTsHm66CSWKg:398:21:Bil Lewis:/user/lewis:/bin/csh

---------- Buffer: bar ----------

insert-directoryの定義にあるcall-processの よい使用例をつぎに示す。

 
(call-process insert-directory-program nil t nil switches
              (if full-directory-p
                  (concat (file-name-as-directory file) ".")
                file))

Function: call-process-region start end program &optional delete destination display &rest args
この関数は、programを動かすプロセスの標準入力として startendのあいだのテキストを送る。 deletenil以外であると、送ったテキストを削除する。 これは、カレントバッファに送った入力のかわりに出力を挿入することを 意味するdestinationtであるときに有用である。

引数destinationdisplayは、 サブプロセスからの出力をどのように扱い、 出力か到着するたびに表示を更新するかどうかを制御する。 詳しくは、上記のcall-processの記述を参照。 destinationが整数0であると、 call-process-regionは、サブプロセスの終了を待たずに 出力を破棄してただちにnilを返す。

残りの引数argsは、プログラムに対する コマンド行引数を指定する文字列である。

call-process-regionの戻り値はcall-processと同様であり、 待たずに戻るように指示するとnilであり、 さもなければサブプロセスの終了状態を表す数か文字列である。

つぎの例では、 バッファ`foo'の始めの5文字(単語`input')を標準入力として ユーティリティcatを実行するためにcall-process-regionを使う。 catは、標準入力を標準出力へコピーする。 引数destinationtであるので、 出力はカレントバッファに挿入される。

 
---------- Buffer: foo ----------
input-!-
---------- Buffer: foo ----------

(call-process-region 1 6 "cat" nil t)
     => nil

---------- Buffer: foo ----------
inputinput-!-
---------- Buffer: foo ----------

コマンドshell-command-on-regionは、 つぎのようにcall-process-regionを使う。

 
(call-process-region 
 start end         
 shell-file-name      ; プログラムの名前
 nil                  ; リージョンを削除しない
 buffer               ; 出力はbufferへ入れる
 nil                  ; 出力中は再表示しない
 "-c" command)        ; シェルに対する引数

Function: shell-command-to-string command
この関数は、シェルコマンドとしてcommand(文字列)を実行し、 コマンドの出力を文字列として返す。



This document was generated by Takeshi Sasaoka on , 21 2002 using texi2html