Link to the example... on wiki.tcl.tkTCL 예제가 작동하지 않는 이유는 무엇입니까?
파이프를 통해 통신하는 실행 가능 모듈을 사용하여 tcl을 확장하는 예제가 있습니다. (실행 모듈 (EM) 섹션에 있음)
우분투 및 Windows XP를 사용하여 프로그램을 컴파일했습니다. 모듈을 테스트하는 스크립트를 실행하려고하면 둘 다 중단됩니다.
예제에 무엇이 누락 되었습니까?
Link to the example... on wiki.tcl.tkTCL 예제가 작동하지 않는 이유는 무엇입니까?
파이프를 통해 통신하는 실행 가능 모듈을 사용하여 tcl을 확장하는 예제가 있습니다. (실행 모듈 (EM) 섹션에 있음)
우분투 및 Windows XP를 사용하여 프로그램을 컴파일했습니다. 모듈을 테스트하는 스크립트를 실행하려고하면 둘 다 중단됩니다.
예제에 무엇이 누락 되었습니까?
예가 파이프의 출력면을 지우는 처리가 누락 된 것처럼 보입니다. 데이터는 실제로 다른 프로세스로 즉시 보내지 않고 OS 버퍼 (몇 킬로 바이트를 기다리는 중)에서 버퍼링됩니다. 이 버퍼링은 출력이 터미널이 아닌 다른 것으로 전달 될 때만 발생하므로 대화식으로 테스트 할 때 출력을 볼 수 없습니다. (그 같은 많은 양의 데이터가 기록되는 경우, 그 버퍼링을 갖는 향상된 효율 승자 때 중요하지 않다.)
C면에상기 main
함수의 상단이 줄을 추가
setvbuf(stdout, NULL, _IONBF, 0);
티클 측면
즉시 서브 프로그램의 개시 후에 이것을 추가
fconfigure $mathModule -buffering none
C면은 모든 printf
후 fflush
를 사용하여 수행 될 수있다. 소스에 액세스 할 수없는 실제 C 프로그램이 붙어 있다면 unbuffer
프로그램으로 전체 프로그램을 래핑하여 진행할 수 있습니다. 실제로는 Expect와 함께 마술을 사용하여 프로그램을 작성하는 Tcl 스크립트입니다. 하위 프로세스는 터미널과 통신하고 있다고 생각합니다.) unbuffer
의 단점은 가상 터미널을 사용한다는 것입니다. 가상 터미널은 일반적인 이전 프로세스 ID (파이프/파일 설명자는 말할 것도 없습니다)보다 훨씬 제한된 리소스 풀에서 제공됩니다.
Expect를 사용하여 예제 C를 사용하여 성공을 거두고 있습니다. 배워야 할 또 다른 일은 끝났습니다. 또한 예제에서 C 코드를 대체하기 위해 flex/bison을 배우고 있습니다.
기대 효과가 있습니다. 그 일을 가능하게하는 데는 큰 어려움이 있습니다. –