2016-06-23 4 views
2

컴퓨터 대수학 시스템 Maxima는 프론트 엔드 (wxMaxima 또는 xMaxima)에 연결하기 위해 (open-socket)을 사용합니다. 이에 때때로 창 메모리 부족 조건이 여전히 표준 출력을 통해 신호를받을 수있는 예외를 제외하고 있음 (잘 작동Lisp : open-socket으로부터의 연결이 방금 끊어진 것을 알리는 콜백이 있습니까?

(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)) 

밖으로 외 : 그 후에는 모든 출력이 실제로 프론트 엔드에 전달되어 있는지 확인합니다 메모리가 애플리케이션 맥시마에 "연결이 끊어진"메시지를 보내지 않으려하지만이 문제를 해결하기 쉽습니다. 불행히도 네트워크 연결이 끊어지면 오류 메시지가 표시됩니다. 오류 출력이 네트워크에 연결하면 오류 메시지가 나타납니다.

무한 루프가 발생하기 전에 연결 손실을 잡을 방법이 있습니까?

겉으로보기에는 기본적인 질문을하는 것이 유감입니다. 하지만 몇 달 동안 해결책을 찾지 못했고 전문가의 도움이 필요하다고 생각합니다.

+0

관심있는 사람은 https://github.com/andrejv/maxima/blob/a7fedfafb146c1f33c42bdd71f421d559a8ca0be/archive/src/server.lisp#L11입니다. 나는 그런 콜백이 있다고 생각하지 않는다. 문제를 올바르게 이해했다면 소켓 오류를 처리하고 대체 스트림을 제공하는 사용자 정의 스트림 객체 내부에 소켓을 래핑 해보는 것이 좋습니다. – coredump

+1

Lisp 구현을 떠나서 TCP *에 그러한 이벤트가 없음을 이해해야합니다. 실제로 네트워크 작업에 종사하지 않는 한 : 읽기, 쓰기 또는 멀티플렉싱 된 선택으로 TCP가 Lisp에게 연결이 끊어 졌음을 알릴 방법이 없습니다. – EJP

답변

1

일반적인 Lisp 구현이 네트워크 오류를 처리하는 방법은 구현에 따라 다릅니다.

일반적으로 오류 상태가 표시됩니다.

따라서 이러한 문제가 발생할 수있는 조건 핸들러를 제공해야합니다. Common Lisp 조건 시스템과 조건 처리 방법에 대해 알아야합니다. 스트림, 소켓, 네트워크 연결이 어떻게 작동하는지는 구현에 따라 다릅니다.