2016-07-23 1 views
1

PostScript 절차에서 영구 변경을위한 코드를 실행하려고합니다. 는 절차로 포장하지 않고, 일이 잘 작동 : 포스트 스크립트 프로 시저에이 포장 및 myprocedure로를 호출 할 때PostScript 프로 시저 내에서 exitserver 사용

serverdict begin 0 exitserver 
(PERMANENT_STUFF_HERE) == 

그러나, 그것은 코드를 보인다 exitserver가 더 이상 실행되지 않습니다 후 :

/myprocedure { 
    serverdict begin 0 exitserver 
    (PERMANENT_STUFF_HERE) == 
} def 
myprocedure 

왜 이런가요? PostScript 프로 시저는 간단한 매크로 였지만 호출 할 때 프로 시저 이름을 해당 내용으로 바 꾸었습니다. 프로 시저 내에서 exitserver/startjob 코드를 호출 할 가능성이 있습니까?

답변

1

exitserver를 실행하면 서버 루프가 종료됩니다. 바로. 루프에있는 경우 :

{ 
    (before exit\n) print 
    exit 
    (after exit\n) print 
} loop 

그러면 'before'가 처리되었지만 이후에는 표시되지 않습니다. exitserver는 본질적으로 같은 종류의 작업입니다. 실행중인 컨텍스트가 종료되고 스택이 정리됩니다.

따라서 프로 시저 (실행 배열이고 매크로가 아닌 프로 시저)를 반쯤 수행하면 실행 스택이 정리되고 컨트롤이 호출 문맥

이제 작업 서버 루프를 종료하면 인터프리터는 처리 입력을 수행하므로 프로 시저에 있지 않을 때 예상 한대로 처리됩니다. exitserver를 실행할 때 서버 루프가 종료되면 인터프리터는 바이트를 입력으로 해석합니다.

프로 시저에서 'exitserver'를 실행할 수는 있지만 나중에 프로 시저가 계속 실행될 것으로 기대할 수는 없습니다.

어쨌든 exitserver의 실행이 싫은 경우에는 PostScript 프로그램을 실행하는 데 필요한 이유가 있어야합니다.

+0

나는 이것에 대해 더 많이 생각해 왔지만 지금은 그렇게 확신하지 못했습니다. exec 스택이 삭제 된 경우 "통역사가 처리 입력을 계속 수행"할 수 있습니까? 입력 처리는 내부 읽기 루프 나 exec 스택의 실행 파일을 통해 이루어져야합니다. 그래서'exitserver'는 execstack을 삭제하는 것보다 더 외과 적이어야합니다. –

+0

인터프리터는 입력 스트림을 처리합니다. 물론 처리의 중간에있는 것들은 버려집니다. 엑시트 서버 다음의 모든 새 입력은 정상적으로 처리됩니다. 본질적으로 이것은 인터프리터를 '깨끗한'상태로 되돌리고 작업 서버 루프를 종료합니다. 엑시트 서버 다음의 입력에는 '영구적 인'효과가 있습니다. 이렇게하면 작업 캡슐화가 해제됩니다. Ghostscript의 ** 구버전 버전은 작업 서버 루프를 실행하지 않았습니다. ..... – KenS

+0

동의하지만, execstack에 대한 실제 효과는 적어도 jobserver를 삭제하기 전에 파일 객체를 잡아야한다는 것입니다 루프를 시작하고 복구 된 파일을 읽도록 새 루프를 시작하고 파일이 종료 된 후 작업 서버를 다시 시작하도록 스케줄링합니다. 작업 서버를 맨 아래에서 지우고 사용자 부분을 방해하지 않도록 'exitserver'를 설계하는 것은 상상할 수없는 것처럼 보입니다 . 사용자를 이식 할 수없는 기능으로 유인하는 것은 이러한 접근 방식에 큰 단점이 될 수 있습니다.(나는이 지적 운동의 절반이 OP의 Q가 아니라 이것을 실행하는 목표를 향해 있다고 고백해야한다.) –

0

Ken이 말한 것처럼 exitserver절차에서 사용할 수 없습니다. 스트림에서 실행되는 메인 라인 코드 여야합니다. 그러나 재사용 가능한 널 디코딩 된 필터링 된 파일을 사용할 수 있습니다. 그 중 하나를 만드는 방법에 대해서는 Acumen Journal의 2006 년 10 월호를 확인하십시오. 이 예제에서는 이미지 데이터로 사용합니다. 하지만 코드를 넣어도 cvx exec입니다.

관련 문제