2016-06-23 2 views
2

コンピュータ代数システムMaximaは、フロントエンド(wxMaximaまたはxMaxima)に接続するために(open-socket)を使用します。その後、それは、すべての出力が実際にフロントエンドに渡されることを確認します:Lisp:オープンソケットからの接続がちょうど落ちたことを知らせるコールバックはありますか?

(setq *standard-input* sock) 
(setq *standard-output* sock) 
(setq *error-output* sock) 
(setq *terminal-io* sock) 
(setq *trace-output* sock) 
(format t "pid=~a~%" (getpid)) 
(force-output sock) 
(setq *debug-io* sock)) 

これは、メモリ不足の状態がまだアウト・オブ上STDOUT上や窓時々ことを知らされるかもしれないという例外を除いて(正常に動作しますメモリはアプリケーションの最大値に接続されている "接続喪失"メッセージを送信したくないのですが、これを回避するのは簡単です。残念ながらネットワーク接続が失われた場合、エラーメッセージが表示されます。 ...

この結果、無限ループが発生する前に接続損失を検出する方法はありますか?

このような一見基本的な質問を申し訳ありません。しかし、私は今何ヶ月も解決策を見つけられず、私は専門家の助けが必要だと思っています。

+0

興味のある方は、こちらのコードはhttps://github.com/andrejv/maxima/blob/a7fedfafb146c1f33c42bdd71f421d559a8ca0be/archive/src/server.lisp#L11です。私はそのようなコールバックがあるとは思わない。問題を正しく理解していれば、接続エラーを処理してフォールバックストリームを提供するカスタムストリームオブジェクト内にソケットをラップしようとします。 – coredump

+1

Lisp実装以外にも、TCP *にはこのようなイベントはないことを理解する必要があります。実際にネットワーク操作に従事していない限り、読み取り、書き込み、多重化された選択の場合、TCPが接続が切断されたことをLispに知らせる方法はありません。 – EJP

答えて

1

ネットワークエラーを処理するCommon Lisp実装は実装固有のものです。

通常、エラー状態が通知されます。

したがって、このような問題が発生する可能性がある条件付きハンドラを提供する必要があります。 Common Lisp状態システムと条件の処理方法について学ぶ必要があります。ストリーム、ソケット、ネットワーク接続でどのように動作するかは実装固有のものです。

関連する問題