2017-03-14 2 views
0

저는 CCL Lisp을 사용하여 여러 실험을 병렬로 실행하고 있습니다. 내 컴퓨터에서 모든 것이 잘 돌아갑니다. 그러나, 나는 이것을 서버에서 사용하고 싶다. 내가 서버에서이 작업을 실행할 때, 나는 항상 다음과 같은 오류 메시지가이 오류를 trowing 때CCL Lisp에서 깨진 파이프 오류

> 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 메일 링리스트를 사용하도록 제안합니다. 또한 backtrace에 대해 생각해보십시오 ... http://ccl.clozure.com 메일 링리스트를 참조하십시오 ... –

답변

1

"깨진 파이프"는 Lisp 프로세스가 파이프에 쓰고있을 때 파이프에서 읽어야하는 프로세스가 작동하지 않는다는 것을 의미합니다.

IOW, 문제는 입니다. 아마도은 Lisp 외부에 있습니다. 다른 프로세스에서 어떤 일이 일어나는지 확인해야합니다.

추신. write-stringprinc을 하나의 write-line으로 결합 할 수 있습니다. 또한 finish-output으로 즉시 전화하는 경우 force-output이 필요하지 않습니다.

+0

그는 LF를 작성하기 위해 PRINC를 사용합니다. WRITE-LINE은 Windows에서 CRLF가 될 수있는 줄 바꿈을 작성하고 Unix 계열 시스템에서는 LF 만 작성할 수 있습니다. 소프트웨어가 Unix/Linux에서만 실행되는 경우 문제가되지 않습니다. –

+0

@RainerJoswig : 예, 알고 있습니다. 그러나 특정 버전의 개행을 필요로하는 프로토콜은 고장 났고 요즘에는 많은 것들이 의심 스럽습니다. [유니 코드 개행 가이드 라인] (http://www.unicode.org/reports/tr13/tr13-9.html) : "_ 특정 캐릭터 플랫폼에서 NLF를 나타내는 캐릭터가 입력 및 해석에 대해 알고있는 경우에도 CR을 처리하고, LF, CRLF 및 NEL은 동일합니다. 출력에서만 사용자를 구분해야합니다. " 필자는 의도적으로 깨진 프로토콜을 코딩하는 것보다'write-line '에 대해 잊어 버릴 확률이 더 높다고 생각한다. – sds

+0

프로토콜이 특정 라인 엔드를 지정하기 때문에 프로토콜이 손상되지 않습니다. 예 : HTTP **에는 ** CRLF가 필요합니다. https://www.w3.org/Protocols/rfc2616/rfc2616-sec2.html#sec2.2 W3C가 ** 깨 졌는지 여부 **에 대해 신경 쓰지 않는다고 생각합니다. CRLF가 필요합니다. –