2010-07-20 4 views
2

C++ 응용 프로그램에서 함수 (LLVM JIT)를 호출해야합니다. 이 호출은 실패하거나 심지어 abort() 또는 exit() 신호를 보일 수 있습니다. 호스트 응용 프로그램에 미치는 영향을 피하거나 최소한 줄이려면 어떻게해야합니까? 누군가는 fork()를 사용하도록 제안했지만, 나는 윈도우와 posix 모두를위한 해결책이 필요하다. fork()를 사용하더라도 ... 두 프로세스가 통신 할 수 있습니까 (일부 포인터 전달)?함수 호출을 방탄으로 만드는 방법은 무엇입니까?

+0

IIRC, LLVM JIT는 기능을 재정의 할 수 있습니다. IOW 애플리케이션은 함수를 선언하여 JIT 환경에 배치 할 수 있습니다. LLVM 메일 목록을 확인할 가치가 있습니다. – Dummy00001

답변

2

기본적으로 실패 할 수도있는 호출을 분리해야합니다. 그렇기 때문에 아마도 별도의 프로세스를 만들어야 할 것입니다. 나는 실제로이 특정 호출과 필요한 지원 기능을 포함하는 작은 실행 파일을 만들고 유인물에서 호출하도록 유혹 될 것입니다. 이것은 Windows에서 fork()이 부족하다는 것을 알려주고 동일한 메커니즘을 사용하여 통신 할 수 있도록합니다.

동일한 주소 공간을 공유하지 않기 때문에 프로세스간에 포인터를 전달할 수 없습니다. 내가 할 일은 stdin에서 데이터를 읽고 stdout에 쓰기를하는 프로세스를 생성하는 것입니다.이 프로세스는 데이터를 자식의 stdin으로 파이핑하고 자식의 stdout에서 읽는 것입니다. 기본적으로 유닉스 (커맨드 라인) 필터가 작동하는 방식. 또 다른 대안은 많은 양의 데이터를 전달할 때 디스크의 파일 (더 나은 RAM 디스크)에서 쓰거나 읽거나 그런 방식으로 통신하는 것입니다. 그러나 많은 양의 데이터를 말하는 것이 아니라면 과도합니다 .

Eugen이 주석에서 지적한 것처럼, 포인터를 전달하려는 경우 또는 다른 프로세스 간 통신 메커니즘을 전달하려는 경우 공유 메모리를 사용할 수도 있습니다. 즉, 이들 중첩 된 실행 파일은 처음부터 디버그하기 쉽지 않으므로 가능한 가장 간단한 방법을 선택하십시오.

+0

메시지 대기열은 스레드 간 통신을 수행하는 또 다른 방법입니다. –

+1

공유 메모리를 사용하여 실제로 포인터를 전달할 수 있습니다. Boost.Interprocess에서 공유 메모리를 사용하여 수행 할 수있는 작업을 확인하십시오. –

+0

@Justin Ardini - '크래시'응용 프로그램이 별도의 프로세스에서 살아야하므로 스레드를 사용하면 여기에 적용되지 않습니다. –

관련 문제