Next: Network Servers, Previous: Transaction Queues, Up: Processes [Contents][Index]
Emacs
Lispプログラムは同一マシンまたは他のマシン上の別プロセスにたいしてストリーム(TCP)やデータグラム(UDP)のネットワーク接続(Datagramsを参照)をオープンできます。ネットワーク接続はLispによりサブプロセスと同様に処理されて、プロセスオブジェクトとして表されます。しかし対話を行うそのプロセスはEmacsの子プロセスではなく、プロセスIDをもたず、それをkillしたりシグナルを送信することはできません。行うことができるのはデータの送信と受信だけです。delete-process
は接続をクローズしますが、他方の端のプログラムをkillしません。そのプログラムは接続のクローズについて何を行うか決定しなければなりません。
ネットワークサーバーを作成することによりLispプログラムは接続をlistenできます。ネットワークサーバーもある種のプロセスオブジェクトとして表されますが、ネットワーク接続とは異なりネットワークサーバーがデータ自体を転送することは決してありません。接続リクエストを受信したときは、それにたいして作成した接続を表す新たなネットワーク接続を作成します(そのネットワーク接続はサーバーからプロセスplistを含む特定の情報を継承する)。その後でネットワークサーバーは更なる接続リクエストのlistenに戻ります。
ネットワーク接続とサーバーは、キーワード/引数のペアーで構成される引数リストでmake-network-process
を呼び出すことにより作成されます。たとえば:server
t
はサーバープロセス、:type 'datagram
はデータグラム接続を作成します。詳細はLow-Level Networkを参照してください。以下で説明するopen-network-stream
を使用することもできます。
異なるプロセスのタイプを区別するためにprocess-type
関数はネットワーク接続とサーバーにはnetwork
、シリアルポート接続はserial
、pipe接続にはpipe
、実際のサブプロセスにはreal
をリターンします。
ネットワーク接続にたいしてprocess-status
関数はopen
、closed
、connect
、stop
、またはfailed
をリターンします。ネットワークサーバーにたいしては状態は常にlisten
になります。実際のサブプロセスにたいしてはstop
以外の値はリターンされません。Process Informationを参照してください。
stop-process
とcontinue-process
を呼び出すことにより、ネットワークプロセスの処理の停止と再開が可能です。サーバープロセスにたいする停止は新たな接続の受け付けないことを意味します(サーバー再開時は5つまでの接続リクエストがキューされる。これがOSによる制限でなければこの制限は増やすことができる。Network Processesのmake-network-process
の:server
を参照)。ネットワークストリーム接続にたいしては、停止は入力の処理を行わないことを意味します(到着するすべての入力は接続の再開まで待つ)。データグラム接続にたいしては、いくらかのパケットはキューされますが入力は失われるかもしれません。ネットワーク接続またはサーバーが停止しているかどうかを判断するために、関数process-command
を使用できます。これが非nil
なら停止しています。
ビルトインや外部のサポートを使用することにより、Emacsは暗号化されたネットワーク接続を作成できます。ビルトインのサポートはGnuTLSトランスポート層セキュリティーライブラリーを使用します。the GnuTLS project
pageを参照してください。GnuTLSサポートつきでEmacsをコンパイルした場合には関数gnutls-available-p
が定義されて非nil
をリターンします。詳細はOverview in The Emacs-GnuTLS
manualを参照してください。外部のサポートの場合にはstarttls.elライブラリーを使用します。これはシステム上にgnutls-cli
のようなヘルパーユーティリティーのインストールを要します。open-network-stream
関数は何であれ利用可能なサポートを使用して、暗号化接続作成の詳細を透過的に処理できます。
この関数はオプションで暗号つきでTCP接続をオープンして、その接続を表すプロセスオブジェクトをリターンする。
name引数はプロセスオブジェクトの名前を指定する。これは必要に応じて一意になるよう変更される。
buffer引数はその接続に関連付けるバッファー。その接続からの出力は出力を処理する独自のフィルター関数を指定していない場合には、bufferがnil
ならその接続はバッファーに関連付けられない。
引数hostとserviceは接続先を指定する。hostはホスト名(文字列)、serviceは定義済みのネットワークサービス名(文字列)、またはポート番号(80
のような整数か\"80\"
のような整数文字列)。
残りの引数parametersは主に暗号化された接続に関連するキーワード/引数のペアー:
:nowait boolean
非nil
なら非同期接続を試みる。
:type type
接続のタイプ。オプションは以下のとおり:
plain
通常の暗号化されていない接続。
tls
ssl
TLS (Transport Layer Security)接続。
nil
network
plain接続を開始してパラメーター‘:success’と‘:capability-command’が与えられたら、STARTTLSを通じて暗号化接続への更新を試みる。これが失敗したら暗号化されていない接続のまま留まる。
starttls
nil
と同様だがSTARTTLSが失敗したらその接続を切断する。
shell
shell接続。
:always-query-capabilities boolean
非nil
なら、たとえ‘plain’な接続を行っているときでも常にサーバーの能力を問い合わせる。
:capability-command capability-command
ホストの能力を問い合わせるためのコマンド文字列。
:end-of-command regexp
:end-of-capability regexp
コマンドの終端、またはコマンドcapability-commandの終端にマッチする正規表現。前者は後者のデフォルト。
:starttls-function function
単一の引数(capability-commandにたいする応答)をとりnil
、またはサポートされていればSTARTTLSをアクティブにするコマンドをリターンする関数。
:success regexp
成功したSTARTTLSネゴシェーションにマッチする正規表現。
:use-starttls-if-possible boolean
非nil
なら、たとえEmacsがビルトインのTLSサポートをもっていなくても、日和見的(opportunistic)にSTARTTLSアップグレードを行う。
:warn-unless-encrypted boolean
非nil
、かつ:return-value
も非nil
なら、接続が暗号化されていない場合にはEmacsは警告するだろう。これはほとんどのユーザーがネットワークトラフィックが暗号化されているこを期待するであろうIMAPやその類のプロトコルにたいして有用。
:client-certificate list-or-t
証明書(certificate)のキーと、証明書のファイル自身を命名する(key-file
cert-file)
という形式のリスト、またはこの情報にたいしてauth-source
を尋ねることを意味するt
のいずれか(auth-source in Emacs auth-source
Libraryを参照)。TLSやSTARTTLSにたいしてのみ使用される。:client-certificate
を未指定時に、自動的なauth-source
の問い合わせを有効にするには、network-stream-use-client-certificates
をtにカスタマイズすればよい。
:return-list cons-or-nil
この関数のリターン値。省略またはnil
ならプロセスオブジェクトをリターンする。それ以外なら(process-object
. plist)
という形式のコンスセルをリターンする。ここでplistは以下のキーワード:
:greeting string-or-nil
非nil
ならホストからリターンされたgreeting(挨拶)文字列。
:capabilities string-or-nil
非nil
ならホストの能力(capability)文字列。
:type symbol
接続タイプであり、‘plain’か‘tls’のいずれか。
:shell-command string-or-nil
接続type
がshell
なら、このパラメーターは接続の作成のために実行されるフォーマット仕様文字列として解釈される。利用可能な仕様はホスト名の‘%s’とポート番号の‘%p’。たとえばプレーン接続を作成する前にまず‘gateway’にsshで接続したければ、このパラメーターは‘ssh
gateway nc %s %p’のようになるかもしれない。