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

36.4 非同期プロセスの作成

非同期プロセスを作成すると、Emacsとサブプロセスの両者は ただちに動作を継続します。 そしてプロセスはEmacsと並行に動作し、 両者は以下の節に述べる関数を用いて互いに通信できます。 しかし、通信は部分的に非同期です。 特定の関数を呼び出したときにだけEmacsはプロセスへデータを送り、 Emacsが入力待ちか時間待ちをしているときにだけ プロセスからの出力を受け取れます。

ここでは、非同期プロセスの作成方法について述べます。

Function: start-process name buffer-or-name program &rest args
この関数は、新たな非同期サブプロセスを作成し、 そのプロセスでプログラムprogramを走らせる。 Lispにおいて新たなサブプロセスを表すプロセスオブジェクトを返す。 引数nameはプロセスオブジェクトの名前を指定する。 その名前のプロセスがすでに存在すると、 名前を一意にするために(`<1>'などを付加して)nameを修正する。 バッファbuffer-or-nameは、そのプロセスに対応付けるバッファである。

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

つぎの例では、最初のプロセスは動き始めると 100秒間(休止ではなく)動作する。 そのあいだに2番目のプロセスを動かし始めると、 一意であるためにそれには名前`my-process<1>'が与えられる。 2番目のプロセスは、最初のプロセスが終了するまえに バッファ`foo'にディレクトリ一覧を挿入する。 2番目のプロセスが終了するとそれを表すメッセージがバッファに挿入される。 しばらくして最初のプロセスが終了すると、 別のメッセージがバッファに挿入される。

 
(start-process "my-process" "foo" "sleep" "100")
     => #<process my-process>

(start-process "my-process" "foo" "ls" "-l" "/user/lewis/bin")
     => #<process my-process<1>>

---------- Buffer: foo ----------
total 2
lrwxrwxrwx  1 lewis     14 Jul 22 10:12 gnuemacs --> /emacs
-rwxrwxrwx  1 lewis     19 Jul 30 21:02 lemon

Process my-process<1> finished

Process my-process finished
---------- Buffer: foo ----------

Function: start-process-shell-command name buffer-or-name command &rest command-args
この関数はstart-processと同様であるが、 指定したコマンドを実行するためにシェルを用いる点が異なる。 引数commandはシェルコマンドの名前であり、 command-argsはそのシェルコマンドに対する引数である。 変数shell-file-nameは、使用するシェルを指定する。

start-processで直接にではなく シェルを介してプログラムを実行すると、 引数のワイルドカードなどのシェルの機能を利用できる。 つまり、ユーザー指定の任意のファイル名をコマンドに入れる場合には、 まえもってshell-quote-argumentでクォートし、 ファイル名内のシェルの特別な文字が そのような特別な意味を持たないようにする。 see section 36.2 シェル引数

Variable: process-connection-type
この変数は、非同期サブプロセスとの通信に用いる装置の型を制御する。 これがnil以外であると疑似端末PTYを利用できる場合にはそれを用る。 さもなければパイプを用いる。

シェル(shell)モードなどのユーザーに見えるプロセス向けには、 パイプでは不可能なプロセスとその子プロセスとのあいだで ジョブ制御(C-cC-zなど)を許すので 疑似端末PTYが望ましい。 プログラムの内部目的向けに使われるサブプロセスでは、 効率的なパイプを用いるほうがよい。 また、多くのシステムでは疑似端末PTYの総数には制約があり、 それらを浪費しないほうがよい。

process-connection-typeの値は start-processを呼び出したときに使われる。 したがって、start-processの呼び出しの周りでこの変数を束縛することで、 1つのサブプロセスに対する通信方法を指定できる。

 
(let ((process-connection-type nil))  ; パイプを使う
  (start-process ...))

サブプロセスが実際にはパイプか疑似端末PTYのどちらを 使っているかを調べるには、関数process-tty-nameを使う (see section 36.6 プロセス情報)。



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