2012-03-12 3 views
2

안녕하세요 저는 OS 독립적 인 상태로 유지하려고 노력하고있는 C++ 프로젝트에서 작업 중이며 통신이 필요한 두 프로세스가 있습니다. 다른 프로세스를 비동기 적으로 조정할 수있는 3 번째 프로세스 (서비스 일 가능성이 있음)를 설정하려고 생각했습니다.두 프로세스 간 통신 방법

클라이언트 1은 데이터 준비가 완료되면 중간 프로세스에 알리고 데이터를 전송합니다. 그런 다음 중간 프로세스는 클라이언트 2가 데이터에 대한 준비가되었음을 알릴 때까지이 데이터를 보유합니다. 중간 프로세스가 클라이언트 1에서 새 데이터를 수신하지 못하면 클라이언트 2에게 대기하도록 지시합니다.

이 OS를 독립적으로 유지하려고하기 때문에 사용할 항목을 모르겠습니다. 나는 MPI를 사용하는 방법을 살펴 보았지만 실제로이 목적에 부합하지는 않는다. Boost.ASIO, Named Pipe, RPC 및 RCF도 살펴 보았습니다. 현재 Windows에서 프로그래밍 중이지만 WIN_API를 사용하지 않으려 고하므로 코드가 Linux에서 컴파일 될 수 있습니다.

다음은 두 프로세스에 대해 좀 더 자세히 설명합니다.

중간 프로세스를 통해 GUI (클라이언트 2, Qt로 작성)에서 초기 입력을받는 백엔드 프로세스/모델 (클라이언트 1)이 있습니다. 그런 다음 모델은 최종 조건이 충족 될 때까지 계속 작동하여 데이터가 준비 될 때 서버로 보냅니다. GUI는 중간 프로세스에 정기적 인 간격으로 데이터를 요청하고 모델이 데이터를 업데이트하지 않은 경우 기다려야한다는 메시지를 표시합니다. 데이터가 모델에서 사용 가능 해짐에 따라 사용자가이를 선택하면 현재 세션의 이전 데이터를 파일로 내보낼 수 있기를 원합니다 (예 : GUI에서 인터페이스를 사용하여 데이터를 내보내거나로드합니다.

내 개조 된 백엔드/모델의 권한은 위에서 설명한 디자인을 따르는 것 외에는 최소한입니다. 나는 상당한 양의 C++ 경험을 가지고 있지만 병렬/비동기 응용 프로그램 경험은별로 없습니다. 어떤 도움이나 방향을 크게 주시면 감사하겠습니다.

+3

Boost.ASIO의 목적은 플랫폼에 독립적입니다. Windows와 Linux 모두에서 매우 유사한 소켓을 직접 사용할 수도 있습니다. 당신이 열거 한 모든 방법에 어떤 문제가 있었습니까? –

+0

시도한 방법으로 어떤 문제가 있었는지 잘 모르겠지만 [ZeroC Ice] (http://www.zeroc.com/ice.html)를 참고하십시오. –

+0

@JoachimPileborg 나열된 방법 중 하나에 큰 문제가 없었습니다. 우리는이 유형의 설정에 익숙하지 않기 때문에 어디에 집중해야하는지 잘 모릅니다. Boost.ASIO와 같이 한 프로세스에서 다른 프로세스로 원격 호출을하는 방법은 무엇입니까? – Dark

답변

1

표준 BSD TCP/IP 소켓은 대부분 플랫폼에 독립적입니다. 그들은 Windows와 Unices (Linux와 같은)에서 약간의 차이점을 가지고 작업합니다.

PS 창은 AF_UNIX 소켓을 지원하지 않습니다.

1

boost.interprocess 라이브러리를 확인해 드리겠습니다. 두 프로세스가 동일한 시스템에 있으면 프로세스간에 통신하는 여러 가지 다른 방법이 있으며 플랫폼 독립적 인 방식으로 수행합니다.

0

메시징 시스템을 고려한 것이 확실하지 않지만 프로세스간에 구조화 된 데이터를 보내고 있다면 Google 프로토콜 버퍼를 고려해야합니다.

메시징의 내용 (전달 된 내용)과 관련이 있습니다.

boost :: asio는 양쪽 플랫폼에 C++을 암시하지는 않지만 플랫폼에 독립적입니다. 물론, C++을 사용할 때 boost :: asio를 사용할 수 있습니다.