Next: Deleting Processes, Previous: Synchronous Processes, Up: Processes [Contents][Index]
このセクションでは非同期プロセス(asynchronous process)を作成する方法について説明します。非同期プロセスは作成後はEmacsと並列に実行されて、Emacsは以降のセクション(Input to ProcessesとOutput from Processesを参照)で説明する関数を使用してプロセスとコミュニケーションができます。プロセスコミュニケーションは部分的に非同期なだけであることに注意してください。Emacsは特定の関数を呼び出したときだけプロセスにデータを送信でき、Emacsは入力の待機中か一定の遅延時間の後にのみプロセスのデータを受け取ることができます。
非同期プロセスはpty(pseudo-terminal:
疑似端末)、またはpipeの、いずれかを通じて制御されます。ptyかpipeの選択は、変数process-connection-type
(以下参照)の値にもとづき、プロセス作成時に行われます。ptyは通常、Shellモード内のようにユーザーから可視なプロセスに適しています。それはpipeでは不可能な、そのプロセスおよびその子プロセスとの間でジョブ制御(C-c、C-z、...等)が可能だからです。プログラムの内部的な目的のために使用されるサブプロセスにたいしては、pipeのほうが適している場合が多々あります。それはpipeがより効率的であり、ptyが大量の文字(500byte前後)にたいして導入する迷入文字インジェクション(stray
character
injections)にたいして免疫があるのが理由です。さらに多くのしすてむではptyの合計数に制限があり、それを浪費するのは得策ではありません。
この関数は新たな非同期サブプロセスを作成して、その中でプログラムprogramの実行を開始する。これはLisp内で新たなサブプロセスを意味する、プロセスオブジェクトをリターンする。引数nameは、そのプロセスオブジェクトにたいして、名前を指定する。その名前のプロセスがすでに存在する場合、(‘<1>’を追加することにより)一意になるよう、nameを変更する。バッファーbuffer-or-nameは、そのプロセスに関連付けられたバッファーである。
programがnil
ならEmacsは疑似端末(pty)を新たにオープンして、サブプロセスを新たに作成することなくptyの入力と出力をbuffer-or-nameに関連付ける。この場合には残りの引数argsは無視される。
残りの引数argsは、サブプロセスにコマンドライン引数を指定する文字列である。
以下の例では1つ目のプロセスを開始して100秒間実行(というよりはsleep)される。その間に2つ目のプロセスを開始して、一意性を保つために‘my-process<1>’という名前が与えられる。これは1つ目のプロセスが終了する前にバッファー‘foo’の最後にディレクトリーのリストを挿入する。その後に2つ目のプロセスは終了して、その旨のメッセージがバッファーに挿入される。さらに遅れて1つ目のプロセスが終了して、バッファーに別のメッセージが挿入される。
(start-process "my-process" "foo" "sleep" "100") ⇒ #<process my-process>
(start-process "my-process" "foo" "ls" "-l" "/bin") ⇒ #<process my-process<1>> ---------- Buffer: foo ---------- total 8336 -rwxr-xr-x 1 root root 971384 Mar 30 10:14 bash -rwxr-xr-x 1 root root 146920 Jul 5 2011 bsd-csh … -rwxr-xr-x 1 root root 696880 Feb 28 15:55 zsh4 Process my-process<1> finished Process my-process finished ---------- Buffer: foo ----------
start-process
と同じようにこの関数は非同期サブプロセスを開始して、その内部でprogramを実行してそのプロセスオブジェクトをリターンする。
start-process
との違いは、この関数がdefault-directory
の値にもとづいて、ファイルハンドラーを呼び出すかもしれないという点である。このハンドラーはローカルホスト上、あるいはdefault-directory
に応じたリモートホスト上で、programを実行するべきである。後者の場合、default-directory
のローカル部分は、そのプロセスのワーキングディレクトリーになる。
この関数はprogram、またはprogram-argsにたいしてファイル名ハンドラーの呼び出しを試みない。
そのファイルハンドラーの実装によっては、リターン結果のプロセスオブジェクトにprocess-filter
やprocess-sentinel
を適用することができないかもしれない。Filter FunctionsとSentinelsを参照のこと。
いくつかのファイルハンドラーはstart-file-process
をサポートしないかもしれない(たとえばange-ftp-hook-function
関数)。そのような場合には、この関数は何も行わずにnil
をリターンする。
この関数はstart-process
と同様だが、指定されたコマンドの実行にshellを使用する点が異なる。引数commandは、shellコマンド名である。変数shell-file-name
は、どのshellを使用するかを指定する。
start-process
でプログラムを実行せずにshellを通じて実行することの要点は、引数内のワイルドカード展開のようなshell機能を利用可能にするためである。そのためにはコマンド内に任意のユーザー指定引数を含めるなら、任意の特別なshell文字が、shellでの特別な意味をもたないように、まずshell-quote-argument
でそれらをクォートするべきである。Shell Argumentsを参照のこと。ユーザー入力にもとづいたコマンド実行時には、当然セキュリティ上の影響も考慮するべきである。
この関数はstart-process-shell-command
と似ているが、内部的にstart-file-process
を使用する点が異なる。これによりdefault-directory
に応じてリモートホスト上でもcommandを実行できる。
この変数は非同期サブプロセスと対話するために使用するデバイスタイプを制御する。これが非nil
の場合には利用可能ならpty、それ以外ならpipeが使用される。
process-connection-type
の値は、start-process
の呼び出し時に効果を発揮する。そのため、start-process
の呼び出し前後でこの変数をバインドすることにより、サブプロセスとやり取りする方法を指定できる。
(let ((process-connection-type nil)) ; pipeを使用
(start-process …))
与えられたサブプロセスが実際にはpipeとptyのどちらを取得したかを判断するには関数process-tty-name
を使用する(Process Informationを参照)。