検索エンジンから来た人に注意

このマニュアルは、Emacs ver. 19.x 向けのマニュアルを Mule 2.x の開発にあたり邦訳したものを、 電脳外道学会がミラーリングしているものであり、旧版製品パラノイアであるところの椅子人の趣味によるものです。

しかしながら、現在の Emacs の主流は ver. 20 以降であり、ver 19.x と ver 20.x とでは、仕様の違いが少なからずあります。

したがって、一般的な Emacs ユーザーにとっては、 このマニュアルと実機の動作とが符合しない場合があります。
特に、公開用の Emacs Lisp コードを書こうとする人は、 新バージョンのマニュアル(英語)を参照することを強くおすすめします。


トップページ&リンク | マニュアルの目次 | 検索
Go to the first, previous, next, last section, table of contents.


プロセス

プロセス(process)とは、プログラムが実行できる空間を指すオ ペレーティング・システム用語です。Emacsは一つのプロセス内で動作しま す。Emacs Lispプログラムは、ほかのプログラムを独立したプロセスとし て起動できます。このようなプロセスは、Emacsプロセスのサブプ ロセス(subprocess)または子プロセス(child processと呼ばれ ます。Emacsプロセスは、これらのプロセスの親プロセス(parent process)になります。

Emacsのサブプロセスには、プロセスの作成方法によって、同期 (synchronous)非同期(asynchronous)の2種類があります。同 期サブプロセスを作成すると、Lispプログラムは、そのサブプロセスが 終了するのを待ってから実行を再開します。非同期サブプロセスを作成 すると、そのサブプロセスはLispプログラムと並行して動作します。こ のようなサブプロセスは、Emacs内では、同様に"プロセス"と呼ばれ るLispオブジェクトとして表現されます。Lispプログラムは、このオブ ジェクトを使って、サブプロセスと通信したり、サブプロセスを制御で きます。たとえば、サブプロセスにシグナルを送ったり、ステータス情 報を取得したり、出力を受け取ったり、入力を送ることができます。

Function: processp object
この関数は、objectがプロセスならばt、そうでなければ nilを返します。

サブプロセスを作成する関数

プログラムを実行するための新しいサブプロセスを作成する関数は三つ あります。そのうちの一つであるstart-processは、非同期プロ セスを作成し、プロセス・オブジェクトを返します (see section 非同期プロセスの作成)。後の二つのcall-processcall-process-regionは、同期プロセスを作成し、プロセス・オ ブジェクトを返しません(see section 同期プロセスの作成)。

ここでは、同期プロセスと非同期プロセスについて説明します。三つの 関数はどれも同様に呼び出されるため、共通な引数についてはここで説 明します。

同期か非同期かにかかわらず、関数のprogram引数には、実行す るプログラムを指定します。指定されたファイルが見つからない場合や、 ファイルの実行が不可能な場合は、エラーが通知されます。ファイ ル名が相対的ならば、変数exec-pathが検索するディレクトリの リストとして使われます。Emacsは、起動時に環境変数PATHの値に基づい てexec-pathを初期化します。`~'`.'`..'のような標準のファイル名要素は通常どおり解釈されますが、 環境変数の置換(`$HOME'など)は認識されません。環境変数の置換 を行うには、substitute-in-file-nameを使ってください(see section ファイル名を展開する関数)。

どのサブプロセス作成関数にも、起動するプログラムの標準出力の行き 先を指定するbuffer-or-name引数があります。 buffer-or-namenilならば、フィルタ関数が処理しない かぎり出力を破棄することを意味します(See section プロセス・フィルタ関数。また、 section Lispオブジェクトの読込みと印字)。複数のプロセスの出力を一つのバッファに送ると出 力が無作為に混ざってしまうため、通常は複数のプロセスの出力を同じ バッファに送らないでください。

三つのサブプロセス作成関数のすべてに、&rest引数の argsがあります。argsはすべて文字列でなければならず、 各要素はそれぞれ独立したコマンド・ライン引数としてprogramに 渡されます。これらの文字列は指定されたプログラムに直接渡されるた め、ワイルドカードなどのシェルの機能は使えません。

注意: program引数には、プログラムの名前だけを指定 します。この引数にはコマンド・ライン引数を含めないでください。コマ ンド・ライン引数は、argsを使って指定してください。

サブプロセスのカレント・ディレクトリは、default-directory の値になります(see section ファイル名を展開する関数)。

サブプロセスは、Emacsから環境を引き継ぎます。ただし、 process-environmentを使って別の環境を指定することもできま す。See section OS環境

Variable: exec-directory
この変数の値は、GNU Emacsに付属するプログラムが格納されているディ レクトリの名前(文字列)です。これらのプログラムは、Emacsから起動 するために用意されています。wakeupプログラムは、このよう なプログラムの例です。display-timeコマンドは、 wakeupプログラムを使って、1分に1回通知を受けます。

User Option: exec-path
この変数の値は、サブプロセス内で実行されるプログラムが検索される ディレクトリのリストです。各要素は、ディレクトリの名前(文字列)ま たはnilです。nilは、デフォルトのディレクトリ (default-directoryの値)を意味します。

program引数が絶対ファイル名でない場合、call-processstart-processexec-pathの値を使います。

同期プロセスの作成

Emacsは、同期プロセス(synchronous process)を作成した後、そ のプロセスが終了するのを待ってから実行を再開します。Diredを起動 する場合がこの例です。 Emacsは、lsを同期プロセスとして実 行し、その出力を少し変更します。プロセスが同期的であるため、 Emacsは、ディレクトリ一覧の全体がバッファに届いてから、バッファ に対する操作を実行しようとします。

同期サブプロセスが終了するのをEmacsが待っている間、ユーザーは、 C-gを入力して中断できます。1回目のC-gは、サブプロセ スをSIGINTシグナルでkillしようとしますが、サブプロセスが 実際に終了するまで待ってから中断します。その間にユーザーが C-gをもう一度入力した場合、サブプロセスはSIGKILLで 即座にkillされ、すぐに中断されます。See section とりやめ

バージョン18では、同期サブプロセス関数はnilを返していまし た。バージョン19では、同期サブプロセス関数はプロセスの終了状態を 返します。

Function: call-process program &optional infile destination display &rest args
この関数は、programを独立したプロセスで実行し、プログラム が終了するまで待ちます。

infilenilでなければ、プロセスの標準入力には infileが使われます。infilenilならば、 `/dev/null'が標準入力になります。destination引数には、 プロセスの出力の行き先を指定します。destination引数の例を 次に示します。

バッファ
バッファのポイントの前に出力を挿入します。プロセスの標準出力スト リームと標準エラーストリームの両方が挿入されます。
文字列
文字列を名前とするバッファに切り換えるかバッファを作成して、出力 をそのバッファのポイントの前に挿入します。
t
出力を現在のバッファのポイントの前に挿入します。
nil
出力を破棄します。
0
出力を破棄し、サブプロセスが終了するのを待たずにすぐに戻ります。 この場合、プロセスはEmacsと並行に動作できるため、プロセスは本当 は同期プロセスではありません。しかし、この関数が戻った時点で Emacsがサブプロセスの処理を実質的に終えるという点では、同期プロ セスと考えることができます。
(real-destination error-destination)
標準出力ストリームと標準エラー・ストリームを個別に扱います。標準出 力はreal-destinationで指定されているとおりに処理し、エラー 出力はerror-destinationにしたがって処理します。 error-destinationの値がnilならばエラー出力を破棄し、 tならば標準出力にエラー出力を混合します。エラー出力をリダ イレクトするには、リダイレクト先のファイル名の文字列を error-destinationに指定します。 エラー出力が挿入されるバッファを直接指定することはできません。実 装するのが難しいためです。しかし、エラー出力をテンポラリ・ファイル に送り、そのファイルをバッファに挿入すれば、同様のことを実現でき ます。

displaynilならば、call-processは、出力が挿 入されるたびにバッファを再表示します。displaynil でなければ、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 buffer destination display &rest args
この関数は、programが実行されるプロセスの標準入力に、startから endまでのテキストを送ります。deletenilでな ければ、この関数は送ったテキストを削除します。この機能は、 buffertを指定して出力を現在のバッファに挿入する場 合に役立ちます。

destination引数とdisplay引数は、サブプロセスからの出 力の処理方法と、出力が送られてきたときに表示を更新するかどうかを 指定します。詳細については、上記のcall-processの説明を参 照してください。destinationが整数の0ならば、 call-process-regionは、サブプロセスが終了するのを待たずに、 出力を破棄して即座にnilを返します。

残余引数のargsは、プログラムのコマンド・ライン引数を指定する 文字列です。

call-process-regionの戻り値はcall-processの戻り値 と同様です。プロセスの終了を待たずに戻るように指定した場合は、 nilが返されます。それ以外の場合は、サブプロセスの終了方法 を示す数値または文字列が返されます。

以下の例は、`foo'バッファの最初の5文字(`input')を標準 入力として、call-process-regionを使ってcatユーティ リティを実行します。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)        ; シェルの引数。

MS-DOSでのサブプロセス

MS-DOSでは、同期サブプロセスとやりとりするデータがテキストかバイ ナリかを指定しなければなりません。テキスト・データの場合は、 Emacsで使われる行末記法(改行文字一つ)と、Emacs外で使われる行末記 法(CRLFの2文字)との間での変換が必要になります。

サブプロセスに送られる入力にはbinary-process-input変数が 適用され、サブプロセスから受け取る出力には binary-process-output変数が適用されます。データがテキスト でない場合は、これらの変数の値にnil以外を指定します。デー タがテキストであり、変換が必要な場合は、これらの変数にnil を指定します。

Variable: binary-process-input
この変数がnilならば、同期サブプロセスの入力の改行を CRLFに変換します。

Variable: binary-process-output
この変数がnilならば、同期サブプロセスの入力のCRLFを 改行にに変換します。

関連情報については、See section ファイルとMSDOS

非同期プロセスの作成

非同期プロセス(asynchronous process)が作成された後、Emacs とLispプログラムはどちらも即座に実行を再開します。プロセスはその 時点からEmacsと並行に動作し、Emacsとプロセスは以下で説明する関数 を使って互いに通信できます。ここでは、start-processによる 非同期プロセスの作成方法について説明します。

Function: start-process name buffer-or-name program &rest args
この関数は、新しい非同期サブプロセスを作成して、その中で動作する プログラムprogramを起動します。この関数は、新しいサブプロ セスをLisp内で表現するプロセス・オブジェクトを返します。 name引数には、プロセス・オブジェクトの名前を指定します。こ の名前のプロセスがすでに存在していれば、nameは一意になるよ うに(`<1>'などを追加して)修正されます。バッファ buffer-or-nameは、プロセスに関連付けられるバッファです。

残余引数のargsは、プログラムのコマンド・ライン引数を指定する 文字列です。

以下の例では、一つめのプロセスは起動して100秒間実行します(正確に は、sleepします)。その間、二つめのプロセスが起動され、一意性を保 つために`my-process<1>'という名前が与えられます。このプロセ スは、最初のプロセスが終了する前に、ディレクトリの一覧をバッファ `foo'の終端に挿入します。そして、二つめのプロセスが終了し、 そのことを示すメッセージがバッファに挿入されます。しばらく経って から、一つめのプロセスが終了し、そのことを示すメッセージがさらに バッファに挿入されます。

(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引数がシェル・コマンドの 引数です。

Variable: process-connection-type
この変数は、非同期サブプロセスとの通信に使われるデバイスの種類を 制御します。この変数がnil以外の場合、PTYが利用可能な らばPTYが使われます。それ以外の場合は、パイプが使われます。

PTYの場合、ジョブ・コントロール(C-cC-zなど)を 使ってプロセスやその子プロセスを制御できるのに対し、パイプはプロ セスの制御ができません。このため、Shellモードのようにプロセスが ユーザーから見える場合、通常はPTYが適しています。プログラム が内部的に使うプロセスの場合は、パイプの方がより効率的なため、通 常はパイプを使うのが適切です。また、多くのシステムではPTYの 総数が限られているため、PTYを浪費しないほうがよいでしょう。

start-processが呼び出されると、 process-connection-typeの値が使われます。このため、 start-processの呼び出しの周辺だけでこの変数を束縛すれば、 特定のサブプロセスとの通信方法を指定できます。

(let ((process-connection-type nil))  ; パイプを使います。
  (start-process ...))

特定のサブプロセスがパイプとPTYのどちらを実際に使っているか を調べるには、process-tty-name関数を使います(see section プロセス情報)。

プロセスの削除

プロセスの削除(deleting a process)とは、Emacsをサブプロセ スから即座に切り離して、そのプロセスをアクティブなプロセスのリス トから削除することです。Emacsはサブプロセスを終了させるためにサ ブプロセスにシグナルを送りますが、サブプロセスが即座に終了すると はかぎりません。プロセス・オブジェクト自体は、ほかのLispオブジェクト がそのプロセス・オブジェクトを指しているかぎり存在し続けます。

プロセスはいつでも明示的に削除できます。プロセスは終了すると自動 的に削除されますが、終了してすぐに削除されるとはかぎりません。終了 したプロセスが自動的に削除される前にそのプロセスを削除しても害は ありません。

Variable: delete-exited-processes
この変数は、(exitの呼び出しまたはシグナルの受信によって) 終了したプロセスの自動削除を制御します。この変数がnilなら ば、ユーザーがlist-processesを実行するまでプロセスは存在し 続けます。それ以外の場合は、プロセスは終了するとすぐに削除されま す。

Function: delete-process name
この関数は、nameに関連付けられているプロセスを SIGHUPシグナルでkillし、プロセスを削除します。name 引数には、プロセス、プロセスの名前、バッファ、バッファの名前のい ずれかを指定できます。
(delete-process "*shell*")
     => nil

Function: process-kill-without-query process
この関数は、Emacsが終了するときにprocessがまだ動作していて もユーザーに問い合わせる必要がないことを宣言します。プロセスは予告 なく削除されます。戻り値はtです。
(process-kill-without-query (get-process "shell"))
     => t

プロセス情報

一部の関数はプロセスに関する情報を返します。対話的な用途のために、 list-processesが用意されています。

Command: list-processes
このコマンドは、アクティブなすべてのプロセスの一覧を表示します。 さらに、ステータスが`Exited'または`Signaled'のプロセス を最終的に削除します。この関数はnilを返します。

Function: process-list
この関数は、削除されていないプロセスすべてのリストを返します。
(process-list)
     => (#<process display-time> #<process shell>)

Function: get-process name
この関数は、nameという名前のプロセスを返します。name という名前のプロセスがなければ、nilを返します。name が文字列でなければ、エラーが発生します。
(get-process "shell")
     => #<process shell>

Function: process-command process
この関数は、processを起動するために実行されたコマンドを返 します。返される値は文字列のリストで、最初の文字列は実行されたプ ログラムを示し、残りの文字列はそのプログラムに与えられた引数を示 します。
(process-command (get-process "shell"))
     => ("/bin/csh" "-i")

Function: process-id process
この関数は、processのPIDを返します。PIDは、一つの コンピュータ上で同時に動作しているほかのプロセスとプロセス processを区別する整数です。プロセスのPIDは、プロセス が起動するときにオペレーティング・システムのカーネルによって選ばれ、 プロセスが存在するかぎり変化しません。

Function: process-name process
この関数は、processの名前を返します。

Function: process-status process-name
この関数は、process-nameのステータスをシンボルとして返しま す。process-name引数は、プロセス、バッファ、プロセス名(文 字列)、バッファ名(文字列)のいずれかでなければなりません。

実際のサブプロセスの場合のステータス値の例を次に示します。

run
動作中のプロセスの場合。
stop
停止しているが再開可能なプロセスの場合。
exit
終了しているプロセスの場合。
signal
重大なシグナルを受け取ったプロセスの場合。
open
オープン状態のネットワーク接続の場合。
closed
クローズ状態のネットワーク接続の場合。いったんクローズされた接続 は再オープンすることはできませんが、同じ場所への新しい接続をオー プンすることはできます。
nil
process-nameが存在するプロセスの名前でない場合。
(process-status "shell")
     => run
(process-status (get-buffer "*shell*"))
     => run
x
     => #<process xx<1>>
(process-status x)
     => exit

ネットワーク接続の場合、process-statusは、シンボルの openまたはclosedを返します。closedは、接続 の相手側が接続をクローズしたか、Emacsがdelete-processを実 行したことを意味します。

以前のバージョン(バージョン19以前)のEmacsでは、ネットワーク接続 のステータスは、オープン状態ならばrun、クローズ状態ならば exitでした。

Function: process-exit-status process
この関数は、processの終了ステータスか、そのプロセスをkill したシグナルの番号を返します(戻り値がこの二つのうちのいずれである かを調べるには、process-statusの結果を使います)。 processがまだ終了していなければ、0が返されます。

Function: process-tty-name process
この関数は、processがEmacsとの通信に使っている端末の名前を 返します。プロセスが端末ではなくパイプを使っている場合は、 nilを返します(section 非同期プロセスの作成process-connection-typeを参照してください)。

プロセスへの入力の送信

Emacsが入力を非同期サブプロセスに送ると、非同期サブプロセスはそ の入力を受け取ります。非同期サブプロセスに入力を送るには、ここで 説明する関数を使います。関数には、入力の送信先のプロセスと、送信 する入力データを指定します。データは、サブプロセスの"標準入力" に置かれます。

一部のオペレーティング・システムでは、PTYの入力バッファの容 量が限られています。そのようなシステムでは、Emacsは送信するデー タ中にEOFを周期的に挿入し、入力データを強制的に読み取らせま す。 ほとんどのプログラムでは、このEOFによる悪影響はありま せん。

Function: process-send-string process-name string
この関数は、stringの内容を標準入力としてprocess-name に送ります。process-name引数は、プロセスまたはプロセスの名 前でなければなりません。process-name引数がnilならば、 現在のバッファのプロセスが使われます。

この関数はnilを返します。

(process-send-string "shell<1>" "ls\n")
     => nil

---------- Buffer: *shell* ----------
...
introduction.texi               syntax-tables.texi~
introduction.texi~              text.texi
introduction.txt                text.texi~
...
---------- Buffer: *shell* ----------

Command: process-send-region process-name start end
この関数は、startendで定義されるリージョンを標準入 力としてprocess-nameに送ります。process-nameはプロセ スまたはプロセスの名前です(この引数がnilならば、現在のバッ ファのプロセスが使われます)。

startendのどちらかが現在のバッファ内での位置を示 す整数またはマーカーでなければ、エラーが発生します(どちらの値が 大きいかは無関係です)。

Function: process-send-eof &optional process-name
この関数は、process-nameの入力にend-of-fileを置きます。 EOFは、すでに送られているテキストの後に置かれます。

process-nameを指定しなかった場合や、process-namenilの場合は、この関数は現在のバッファのプロセスにEOF を送ります。現在のバッファにプロセスがなければ、エラーが発生しま す。

この関数はprocess-nameを返します。

(process-send-eof "shell")
     => "shell"

プロセスへのシグナルの送信

サブプロセスへのシグナルの送信(sending a signal)は、サブプ ロセスの動作に割り込む方法の一つです。シグナルにはいくつかの種類 があり、それぞれ意味があります。シグナルとその名前は、オペレーティ ングシステムで定義されています。たとえば、SIGINTシグナル は、ユーザーがC-cを入力したか、それに類似した状況が発生し たことを意味します。

各シグナルは、サブプロセスに対して特定の影響があります。ほとんど のシグナルはサブプロセスをkillしますが、実行を停止させたり再開さ せるシグナルもあります。ほとんどのシグナルは、プログラムが処理す ることもできます。プログラムがシグナルを処理する場合、そのシグナ ルの一般的な意味が通用するとはかぎりません。

シグナルを明示的に送るには、ここで説明する関数を呼び出します。ま た、Emacsは、次のような場合に自動的にシグナルを送ります。バッファ をkillする場合は、そのバッファに関連付けられているプロセスすべて にSIGHUPシグナルを送ります。Emacsが終了する場合は、残って いるプロセスすべてにSIGHUPシグナルを送ります (SIGHUPは、通常はユーザーが電話回線を切断したことを示すシグ ナルです)。

どのシグナル送信関数も、process-namecurrent-group の二つの省略可能引数を取ります。

process-name引数は、プロセス、プロセス名、nilのいず れかでなければなりません。この引数がnilならば、デフォルト として現在のバッファに関連付けられているプロセスが使われます。 process-nameがプロセスを示していない場合は、エラーが発生し ます。

current-group引数は、ジョブ・コントロール機能を持つシェル をEmacsのサブプロセスとして実行している場合に意味を持つフラグで す。 この引数がnil以外ならば、Emacsがサブプロセスとの通信 に使っている端末の現在のプロセス・グループにシグナルが送られます。 プロセスがジョブコントロール可能なシェルならば、現在のプロセス・ グループはシェルの現在のサブジョブです。この引数がnilなら ば、Emacsの直接のサブプロセスのプロセス・グループにシグナルが送 られます。サブプロセスがジョブ・コントロール可能なシェルならば、 そのシェル自体にシグナルが送られます。

オペレーティング・システムはパイプの区別をサポートしていないため、 パイプを使ってサブプロセスと通信している場合、 current-groupフラグは意味を持ちません。同様の理由で、パイ プを使っているときはジョブ・コントロール可能シェルはうまく動作し ません。section 非同期プロセスの作成process-connection-typeを参照してください。

Function: interrupt-process &optional process-name current-group
この関数は、SIGINTシグナルを送ることによってプロセス process-nameに割り込みます。Emacsの外では、"割り込み文字" (通常、C-cであるシステムとDELであるシステムがありま す)を入力するとこのシグナルが送られます。current-group引数 がnil以外の場合は、Emacsが端末で"C-cを入力する"こ とによってサブプロセスと対話するための関数と考えることもできます。

Function: kill-process &optional process-name current-group
この関数は、SIGKILLシグナルを送ることによって、プロセス process-nameをkillします。このシグナルはサブプロセスを即座 にkillするため、サブプロセスがこのシグナルを処理することはできま せん。

Function: quit-process &optional process-name current-group
このプロセスは、SIGQUITシグナルをプロセス process-nameに送ります。このシグナルは、Emacsの外で"中断 文字" (通常はC-bまたはC-\)を入力したときに送られる シグナルです。

Function: stop-process &optional process-name current-group
この関数は、SIGTSTPシグナルを送ることによって、プロセス process-nameを停止させます。プロセスの実行を再開するには、 continue-processを使います。

ジョブ・コントロールがあるシステムでは、(Emacsの外で)"停止文字" (通常はC-z)を入力すると、このシグナルが送られます。 current-groupnil以外の場合は、Emacsがサブプロセス との通信に使っている端末で"C-zを入力する"関数と考えるこ ともできます

Function: continue-process &optional process current-group
この関数は、SIGCONTシグナルを送ることによって、プロセス processの実行を再開します。この関数は、processがすで に停止していることを仮定します。

Function: signal-process pid signal
この関数は、プロセスpidにシグナルを送ります。プロセスは Emacsの子プロセスでなくてもかまいません。signal引数には、 送信するシグナルを指定します。この引数は整数でなければなりません。

プロセスからの出力の受け取り

サブプロセスがそれ自体の標準出力ストリームに書き込んだ出力を受け 取るには、二つの方法があります。一つは出力をバッファに挿入する方法 です。このバッファは、プロセスに関連付けられたバッファと呼ばれま す。もう一つの方法は、フィルタ関数(filter function)と呼ばれ る関数を出力に作用させる方法です。プロセスに対してバッファもフィ ルタ関数もない場合は、プロセスの出力は破棄されます。

プロセスのバッファ

プロセスには、関連付けられたバッファ(associated buffer)を 設定できます(通常はバッファが関連付けられています)。プロセスに関 連付けられたバッファは、プロセスからの出力の格納と、プロセスを killするタイミングの決定の二つの目的に使われる、通常のEmacsバッファ です。また、通常は一つのバッファには一つのプロセスしか関連付けられ ていないため、このバッファを使って、操作の対象となるプロセスを指 定できます。また、プロセスを利用する場合のほとんどは、プロセスに 送られる入力をこのバッファを使って編集しますが、この機能はEmacs Lispには組み込まれていません。

プロセスにフィルタ関数(see section プロセス・フィルタ関数)がなければ、プロ セスの出力は関連付けられているバッファに挿入されます。出力が挿入 される位置は、process-markによって決まります。この変数は、 挿入後、挿入されたテキストの終端を指すように更新されます。通常は (常にではありません)、process-markはバッファの終端です。

Function: process-buffer process
この関数は、プロセスに関連付けられているバッファを返します。 process.
(process-buffer (get-process "shell"))
     => #<buffer *shell*>

Function: process-mark process
この関数は、processのプロセス・マーカーを返します。プロセ ス・マーカーとは、プロセスからの出力が挿入される位置を示すマーカー です。

processにバッファが関連付けられていなければ、 process-markは、どこも指さないマーカーを返します。

バッファにプロセスの出力を挿入するときは、このマーカーを使って挿 入位置が決定されます。また、このマーカーは、挿入されたテキストの 後を指すように更新されます。連続した出力が順番に挿入されるのはこ のためです。

通常のフィルタ関数では、出力がバッファに直接挿入されるときと同様 にこのマーカーを使ってください。フィルタ関数のよい例としては、こ の項の終りにあるprocess-markを使ったフィルタ関数がありま す。

プロセスとの通信用のバッファにユーザーが入力を行う場合、前回の出力 と新しい入力を区別するのにプロセス・マーカーが役立ちます。

Function: set-process-buffer process buffer
この関数は、processに関連付けられているバッファを bufferに設定します。buffernilならば、プロセ スにはバッファは関連付けられません。

Function: get-buffer-process buffer-or-name
この関数は、buffer-or-nameに関連付けられているプロセスを返 します。バッファに複数のプロセスが関連付けられている場合は、その うちの一つが選ばれます(現時点では、最後に作成されたバッファが選ば れます)。通常は、一つのバッファに複数のプロセスを関連付けるのはよ くありません。
(get-buffer-process "*shell*")
     => #<process shell>

プロセスのバッファをkillするとそのプロセスは削除され、サブプロセ スはSIGHUPシグナルでkillされます(see section プロセスへのシグナルの送信)。

プロセス・フィルタ関数

プロセスフィルタ関数(filter function)とは、関連付けられて いるプロセスからの標準出力を受け取る関数です。プロセスにフィルタ がある場合、そのプロセスからの出力のすべてがフィルタに渡 されます。プロセス・バッファは、フィルタがない場合だけ、プロセスか らの出力を直接受け取るために使われます。

フィルタ関数は、関連付けられているプロセスと文字列(プロセスの出 力)の二つの引数を取らなければなりません。この条件を満たせば、フィ ルタ関数は出力に対して任意の処理を行うことができます。

フィルタ関数は、Emacsが待機中のとき(たとえば、端末入力待ち、時間 の経過待ち、プロセスの出力待ちなど)だけ動作します。これによって、 ほかのLispプログラムの実行中に予期せぬタイミングでフィルタを実行 することによる問題を避けることができます。Emacsを明示的に待機状 態にしてフィルタ関数が実行されるようにするには、sit-forsleep-for (see section 時間の経過あるいは入力を待つ)、accept-process-output (see section プロセスからの出力の受け取り)のいずれかを呼び出します。また、Emacs は、コマンド・ループで入力を読み出しているときにも待機状態になり ます。

通常、フィルタ関数内では中断は禁止されています。中断が禁止されて いなければ、コマンド・レベルでのC-gの入力やユーザー・コマ ンドの中断による影響を予測できなくなります。フィルタ関数内で中断 を有効にするには、inhibit-quitnilを束縛してくだ さい。See section とりやめ

フィルタ関数の実行中に発生したエラーは自動的に捕捉されるため、 フィルタ関数が起動したときに動作していたプログラムの実行は停止し ません。しかし、debug-on-errornil以外ならば、エ ラーの捕捉は行なわれません。これによって、Lispデバッガを使ってフィ ルタ関数をデバッグできます。See section Lispのデバッガ

多くのフィルタ関数は、フィルタ関数がないときのEmacsの動作をまね て、ほとんどの場合テキストをプロセスのバッファに挿入します。この ようなフィルタ関数において、バッファに確実に挿入できるようにする ためには、set-bufferを使わなければなりません。現在のバッ ファを半永久的に設定しないようにするため、このようなフィルタ関数 では、unwind-protectを使って、以前に現在のバッファとして 使われていたバッファを復元できるようにしなければなりません。また、 プロセス・マーカーを更新し、場合によってはポイントの値を更新しな ければなりません。これらの作業の実現方法を次に示します。

(defun ordinary-insertion-filter (proc string)
  (let ((old-buffer (current-buffer)))
    (unwind-protect
        (let (moving)
          (set-buffer (process-buffer proc))
          (setq moving (= (point) (process-mark proc)))
          (save-excursion
            ;; テキストを挿入し、プロセス・マーカーを移動します。
            (goto-char (process-mark proc))
            (insert string)
            (set-marker (process-mark proc) (point)))
          (if moving (goto-char (process-mark proc))))
      (set-buffer old-buffer))))

save-excursionに現在のバッファを復元させずに、 unwind-protectを明示的に使っているのは、goto-char によるポイントの変化を有効にするためです。

新しいテキストを受け取るたびにフィルタ関数がプロセス・バッファを強 制的に表示させるには、次に示す行をunwind-protectの直前に 挿入してください。

(display-buffer (process-buffer proc))

以前のポイントの位置に関係なく、ポイントを新しい出力の終端に強制 的に移動するには、変数movingを削除し、goto-charを 無条件に呼び出してください。

以前のバージョンのEmacsでは、正規表現によく検索や照合を行うフィ ルタ関数は、必ず一致データを明示的に保存、復元しなければなりませ んでした。現在では、Emacsがこの作業を自動的に行ってくれるため、 フィルタ関数側で明示的に行う必要はなくなりました。See section 一致データ

プロセスのバッファに出力を書き込むフィルタ関数は、バッファがまだ 有効かどうかをチェックしなければなりません。無効な(dead)バッファ に出力を挿入しようとすると、エラーが発生します。バッファが無効で ある場合、(buffer-name (process-buffer process))nilを返します。

フィルタ関数に渡される出力のひとまとまりのサイズは不定です。たと えば、出力を1行ごとに複製するプログラムが一度に200文字を送ってき たり、その次には40文字を5回送ってくることがあります。

Function: set-process-filter process filter
この関数は、processにフィルタ関数filterを設定し ます。filternilならば、プロセスにはフィルタは設定 されません。

Function: process-filter process
この関数は、processのフィルタ関数を返します。フィルタ関数 がなければ、nilを返します。

フィルタ関数の使い方の例を次に示します。

(defun keep-output (process output)
   (setq kept (cons output kept)))
     => keep-output
(setq kept nil)
     => nil
(set-process-filter (get-process "shell") 'keep-output)
     => keep-output
(process-send-string "shell" "ls ~/other\n")
     => nil
kept
     => ("lewis@slug[8] % "
"FINAL-W87-SHORT.MSS    backup.otl              kolstad.mss~
address.txt             backup.psf              kolstad.psf
backup.bib~             david.mss               resume-Dec-86.mss~
backup.err              david.psf               resume-Dec.psf
backup.mss              dland                   syllabus.mss
"
"#backups.mss#          backup.mss~             kolstad.mss
")

プロセスからの出力の受け取り

通常、非同期サブプロセスからの出力は、時間の経過や端末入力などの なんらかの外部イベントをEmacsが待っているときだけ到着します。し かし、出力が特定の時点で到着するようにLispプログラムから指定した り、プロセスからの出力が到着するまでLispプログラムが待機できると 便利なことがあります。

Function: accept-process-output &optional process seconds millisec
この関数は、まだ完了していないプロセスからの出力をEmacsが読み出 すようにします。出力は、プロセスに関連付けられているバッファに挿 入されるか、フィルタ関数に渡されます。processnil 以外ならば、この関数は、processから何らかの出力を受け取る まで戻りません。

seconds引数とmillisec引数には、タイムアウトまでの時 間を指定できます。seconds引数には秒単位の時間を指定し、 millisec引数にはミリ秒単位の時間を指定します。二つの時間は 加算され、accept-process-outputは、サブプロセスからの出力 の有無にかかわらず、指定された時間が経過すると戻ります。

seconds引数は整数でなくてもかまいません。seconds引数 が浮動小数点数ならば、この関数は、小数点以下の秒数も含めて待機し ます。一部のシステムでは、秒数として整数値しかサポートしていませ ん。そのようなシステムでは、secondsは0に向かって丸められま す。小数点以下の秒数をサポートしていないシステムで millisecに0以外の値を指定すると、エラーが発生します。

整数でない秒数での待機をサポートしていないオペレーティングシステ ムもあります。そのようなシステムでは、millisecに0以外の値 を指定するとエラーが発生します。

accept-process-output関数は、何らかの出力を受け取った場合 はnil以外を返します。出力が到着する前にタイムアウト時間が 経過した場合は、nilを返します。

監視関数: プロセスのステータス変化の検出

プロセスの監視関数(process sentinel)とは、(Emacsから送られ るか、プロセス自体の動作によって発生した)シグナルによる終了、停 止、再開などの何らかの理由によって、関連付けられているプロセスの ステータスが変化するたびに呼び出される関数です。また、プロセスの 監視関数は、プロセスが終了するときにも呼び出されます。監視関数は、 イベントが発生したプロセスと、イベントの種類を示す文字列の二つの 引数を受け取ります。

イベントを示す文字列は次のいずれかのようになります。

監視関数は、(端末入力待ちや時間経過待ち、プロセスの出力待ちなど) Emacsが待機中のときだけ動作します。ほかのLispプログラムの実行中 に予期せぬタイミングで監視関数が実行さえることによる問題を避ける ことができます。Emacsを明示的に待機状態にして監視関数が実行され るようにするには、sit-forsleep-for (see section 時間の経過あるいは入力を待つ)、accept-process-output (see section プロセスからの出力の受け取り)のいずれかを呼び出します。また、Emacs は、コマンド・ループで入力を読み出しているときにも待機状態になりま す。

通常、監視関数の中では中断は禁止されています。中断が禁止されて いなければ、コマンド・レベルでのC-gの入力やユーザー・コマンドの 中断による影響を予測できなくなります。監視関数の中で中断を有効 にするには、inhibit-quitnilを束縛してください。 See section とりやめ

プロセスのバッファに出力を書き込む監視関数は、バッファがまだ有効 かどうかをチェックしなければなりません。無効な(dead)バッファに出 力を挿入しようとすると、エラーが発生します。バッファが無効である 場合、(buffer-name (process-buffer process))nilを返します。

監視関数の実行中に発生したエラーは自動的に捕捉されるため、見張り 番が起動したときに動作していたプログラムの実行は停止しません。し かし、debug-on-errornil以外ならば、エラーの捕捉 は行なわれません。これによって、Lispデバッガを使って監視関数をデバッ グできます。See section Lispのデバッガ

以前のバージョンのEmacsでは、正規表現によく検索や照合を行う見張 り番は、必ず一致データを明示的に保存、復元しなければなりませ んでした。現在では、Emacsがこの作業を自動的に行ってくれるため、 監視関数側で明示的に行う必要はなくなりました。See section 一致データ

Function: set-process-sentinel process sentinel
この関数は監視関数sentinelprocessに関連付けます。 sentinelnilならば、プロセスの監視関数はなくなりま す。監視関数がない場合、デフォルトでは、プロセスのステータス が変化したときにプロセスのバッファにメッセージが挿入されます。
(defun msg-me (process event)
   (princ
     (format "Process: %s had the event `%s'" process event)))
(set-process-sentinel (get-process "shell") 'msg-me)
     => msg-me
(kill-process (get-process "shell"))
     -| Process: #<process shell> had the event `killed'
     => #<process shell>

Function: process-sentinel process
この関数は、processの監視関数を返します。監視関数がない場合は、 nilを返します。

Function: waiting-for-user-input-p
監視関数またはフィルタ関数が動作している間、この関数は、監視関数 またはフィルタ関数が呼び出された時点でEmacsがユーザーからのキーボー ド入力を待っていたならばnil以外を返します。そうでない場合 は、nilを返します。

トランザクション待ち行列

トランザクションによるサブプロセスとのより便利な通信を行うには、 トランザクション待ち行列(transaction queue)を使います。ま ず、tq-createを使って、指定したプロセスとの通信を行うトラ ンザクション待ち行列を作成します。次に、tq-enqueueを呼び 出して、トランザクションを送ります。

Function: tq-create process
この関数は、processと通信するためのトランザクション待ち行 列を作成して返します。process引数は、バイトのストリームを 送受信できるサブプロセスでなければなりません。サブプロセスの種類 としては、子プロセス、(別のマシン上の)サーバーへのTCP接続などが あります。

Function: tq-enqueue queue question regexp closure fn
この関数は、待ち行列queueにトランザクションを送ります。待 ち行列を指定すると、対象とするサブプロセスを指定する効果がありま す。

questionは、トランザクションを開始する、こちら側からのメッ セージです。fn引数は、対応する応答が帰ってきたときに呼び出 される関数です。この関数は、closureと受け取った応答の二つの 引数で呼び出されます。

regexp引数は、応答全体だけに一致する正規表現です。 tq-enqueueは、これを使って応答の終りを判断します。

tq-enqueue自体の戻り値に意味はありません。

Function: tq-close queue
トランザクション待ち行列queueをシャットダウンし、完了して いないトランザクションがすべて完了するのを待ち、接続または子プロ セスを終了させます。

トランザクション待ち行列は、フィルタ関数を使って実装されています。 See section プロセス・フィルタ関数

ネットワーク接続

Emacs Lispプログラムは、同じマシンまたは別のマシンにあるほかのプ ロセスへのTCPネットワーク接続をオープンできます。ネットワーク接 続は、Lispプログラムからはサブプロセスと同様に扱われ、プロセス・ オブジェクトで表現されます。しかし、通信相手のプロセスはEmacsプ ロセスの子プロセスではないため、通信相手のプロセスをkillしたり、 シグナルを送ることはできません。できるのはデータの送受信だけです。 delete-processは接続をクローズしますが、相手側のプロセス をkillしません。接続のクローズへの対処は、相手側のプロセスが決定 しなければなりません。

ネットワーク接続を表現するプロセス・オブジェクトとサブプロセスを表 現するプロセス・オブジェクトを区別するには、process-status を使います。この関数は、ネットワーク接続の場合は必ずopen またはclosedを返します。本当のサブプロセスの場合は、この二つの値のどちらも返しません。See section プロセス情報

Function: open-network-stream name buffer-or-name host service
この関数は、サービスに関するTCP接続をホストに対してオープンしま す。この関数は、接続を表現するプロセス・オブジェクトを返します。

name引数は、プロセス・オブジェクトの名前を指定します。この名 前は、名前を一意にするために必要に応じて修正されます。

buffer-or-name引数は、接続が関連付けられるバッファです。接 続からの出力を処理するフィルタ関数を指定しなければ、接続からの出 力はこのバッファに挿入されます。buffer-or-namenil ならば、接続はどのバッファにも関連付けられません。

host引数とservice引数は、接続先を指定します。 hostはホスト名(文字列)で、serviceは定義済みのネット ワーク・サービスの名前(文字列)またはポート番号(整数)です。


Go to the first, previous, next, last section, table of contents.