Next: Asynchronous Processes, Previous: Shell Arguments, Up: Processes
同期プロセス(synchronous process)を作成すると、
Emacsは実行を続行するまえにそのプロセスが終了するのを待ちます。
diredはその例です。
ls
を同期プロセスで実行し、その出力を少々修正します。
プロセスは同期なので、Emacsがなにかを行おうとするまえに
ディレクトリ一覧全部がバッファに届きます。
Emacsは同期サブプロセスの終了を待ちますが、
ユーザーはC-gと打って中断できます。
C-gはまずシグナルSIGINT
でサブプロセスをキルしようとしますが、
中断を完了するまえにサブプロセスが終了するのを待ちます。
その期間にユーザーがさらにC-gを打つと、
SIGKILL
でサブプロセスを即座にキルし、ただちに中断を完了します。
See Quitting。
同期サブプロセス作成関数は、 そのプロセスがどのように終了したかを表すものを返します。
同期サブプロセスからの出力は、ファイルから読むテキストと同様に、
コーディングシステムを用いて一般には復号化します。
call-process-region
がサブプロセスへ送る入力は、
ファイルへ書くテキストと同様に、
コーディングシステムを用いて符号化します。
See Coding Systems。
この関数は、別のプロセスでprogramを呼び出し、 それが終了するのを待つ。
infileが
nil
でなければ プロセスへの標準入力はinfileであるが、 さもなければ/dev/nullである。 引数destinationでプロセスの出力先をつぎのように指定する。
- バッファ
- このバッファのポイントのまえに出力を挿入する。 これにはプロセスの標準出力と標準エラーの両者を含む。
- 文字列
- 文字列で指定した名前のバッファのポイントのまえに出力を挿入する。
t
- カレントバッファのポイントのまえに出力を挿入する。
nil
- 出力を破棄する。
- 0
- 出力を破棄し、サブプロセスの終了を待たずにただちに戻る。
この場合、このプロセスはEmacsと並行して動作するので真のサブプロセスではない。 しかし、この関数から戻るとEmacsはサブプロセスの処理を本質的には終えたと いう意味で同期プロセスと考えることができる。
(
real-destination error-destination)
- 標準出力と標準エラーを分離し、 real-destinationの指定に従って通常の出力を扱い、 error-destinationに従ってエラー出力を処理する。 error-destinationが
nil
であるとエラー出力を破棄し、t
であると通常の出力に混ぜ、 文字列であるとその名前のファイルにエラー出力を振り向ける。エラー出力を入れるバッファを直接に指定することはできない。 それを実装するのは難しすぎる。 しかし、エラー出力を一時ファイルへ送ってから そのファイルをバッファに挿入すれば、同じ効果を得られる。
displayが
nil
以外であると、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))
この関数は、programを動かすプロセスの標準入力として startとendのあいだのテキストを送る。 deleteが
nil
以外であると、送ったテキストを削除する。 これは、カレントバッファに送った入力のかわりに出力を挿入することを 意味するdestinationがt
であるときに有用である。引数destinationとdisplayは、 サブプロセスからの出力をどのように扱い、 出力か到着するたびに表示を更新するかどうかを制御する。 詳しくは、上記の
call-process
の記述を参照。 destinationが整数0であると、call-process-region
は、サブプロセスの終了を待たずに 出力を破棄してただちにnil
を返す。残りの引数argsは、プログラムに対する コマンド行引数を指定する文字列である。
call-process-region
の戻り値はcall-process
と同様であり、 待たずに戻るように指示するとnil
であり、 さもなければサブプロセスの終了状態を表す数か文字列である。つぎの例では、 バッファ‘foo’の始めの5文字(単語‘input’)を標準入力として ユーティリティ
cat
を実行するためにcall-process-region
を使う。cat
は、標準入力を標準出力へコピーする。 引数destinationがt
であるので、 出力はカレントバッファに挿入される。---------- 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) ; シェルに対する引数