2017-03-14 16 views
0

私は並行して実験のバッチを実行するためにCCLのLispを使用しています。私のマシンでは、すべてが正常に動作しています。しかし、私はこれをサーバー上で使用したいと思います。このエラーをtrowing時に私のコードは常に同じポイントに達する壊れたパイプのエラー

> Error: on #<BASIC-CHARACTER-OUTPUT-STREAM UTF-8 (PIPE/7) #x302001C2725D> : 
>  Broken pipe during write 
> While executing: #<CCL::STANDARD-KERNEL-METHOD CCL::STREAM-IO-ERROR (STREAM T T)>, in process listener(1). 

:私は、サーバー上でこれを実行すると、私はいつも、次のエラーメッセージが表示されます。私はすべてではないcommandsの出力ストリームに書き込まれているので、このエラーは、loop文の内部で発生考える

;; ... A really long function 
    ;; write commands to processes 
    (format t ".. writing commands to process ~a:~%" counter) 
    (loop for c in commands 
      do 
      (format t " ~a~%" c) 
      (write-string c output-stream) 
      (princ #\lf output-stream)) 
    (force-output t) 
    (force-output output-stream) 
    (finish-output output-stream) 
    #-lispworks 
    (close output-stream)) 

:コードの抜粋は以下の通りです。

どのように私はこれをさらにデバッグし、この問題を解決することができますか?

+0

私は、これらの特定のエラーのためにCCLメーリングリストを使用することを提案します。また、バックトレースを考える...メーリングリストの下でhttp://ccl.clozure.comを参照してください... –

答えて

1

「壊れたパイプは、」Lispのプロセスがパイプに書き込みをされたときにパイプから読み込むことになっているプロセスが死んでいることを意味しています。

IOW、問題は、Lispのおそらく外です。他のプロセスで何が起きているのかを確認する必要があります。

PS。 write-stringprincを1つのwrite-lineにまとめることができます。また、finish-outputを直ちに呼び出す場合は、force-outputは必要ありません。

+0

彼はLFを書くためにPRINCを使用します。 WRITE-LINEは、WindowsではCRLF、UnixライクなシステムではLFだけの改行を書きます。ソフトウェアがUnix/Linux上でのみ実行されている場合でも、問題はありません。 –

+0

@RainerJoswig:はい、わかっています。しかし、特定のバージョンの改行を必要とするプロトコルは壊れており、最近多くのことがあるとは思わない。 [Unicodeの改行ガイドライン](http://www.unicode.org/reports/tr13/tr13-9.html):あなたが入力の上や解釈に、特定のプラットフォーム上でNLFを表す文字がわかっている場合、「CRを扱い、_Even、 LF、CRLF、NELは同じです。出力側でのみ、それらを区別する必要があります。私は、人が壊れたプロトコルに意図的にコーディングしているよりも 'write-line'について忘れている可能性が高いと思います。 – sds

+0

プロトコルが特定のリネームを指定しているため、プロトコルが壊れていません。例:HTTP **には** CRLFが必要です。 https://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 W3Cが**壊れていると思われるかどうかは気にしません。 CRLFが必要です。 –

関連する問題