Next: , Previous: Synchronous Processes, Up: Processes


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 Shell Arguments

— 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 Process Information)。