2013-03-11 2 views
0

fork()을 사용하여 다중 프로세스 응용 프로그램을 만들면 FIFO 파이프를 사용하여 통신 할 수 있습니다. C++은 다중 스레드 응용 프로그램 만 지원하며 다중 프로세스 응용 프로그램을 원한다면 fork()에 의존해야한다는 것을 알았습니다.다중 프로세스 C++ fifo

그러나 C++에서 유형 검사가 중요하므로 어떤 위험도없이 파이프를 통해 객체를 파이프 할 수 없습니다. 으로 전송하고 sizeof에게 물어보고 파이프를 통해 모든 것을 보내면 원래 개체로 다시 캐스팅됩니다.

왜 이렇게 느껴지나요? 다중 프로세스 아키텍처가 C++에서 사용되지 않았거나 라이브러리 또는 더 나은 방법으로 작업하고 있습니다. 내가 봤 거든 당신이 발견 한 유일한 것은 멀티 스레드 C 또는 다중 프로세스 C입니다.

더 많은 프로세스를 원한 이유는 내 응용 프로그램을 가능한 한 강력하게 만들고 싶기 때문입니다. 내 웹 서비스가 망가질 경우 주 프로세스에서 다시 시작해야합니다. 하나의 쓰레드가 다른 쓰레드에서 메모리를 손상시키지 않았다는 것을 결코 알지 못하기 때문에 다중 쓰레드를 수행 할 방법이 없다. 그래서 한 쓰레드에서 에러가 발생한다면 안전 장치를 다시 시작해야한다.

+0

"다중 프로세스"를 의미합니다. * 다중 처리 *는 다중 스레드, 다중 프로세스 및 SIMD (단일 스레드이지만 동시에 여러 데이터를 처리하는)를 포함하여 훨씬 광범위한 용어입니다. multi-process를 의미하는'ipc '태그가 붙어있다. –

+0

이 질문은 너무 광범위합니다. 'fork', 그리고'void *'와'sizeof', 멀티 ​​스레딩 .. 강건성에 대해 언급합니다. – Ajay

+0

당신이 처리하고자하는 "대상"이 무엇인지 이해하는 것은 확실히 도움이 될 것입니다. 얼마나 큰데, 어떤 종류의 데이터가 포함되어 있습니까? –

답변

0

다중 프로세스 프로그램은 두 개의 개별 인스턴스를 동시에 실행하고 그 중 일부 공유 데이터를 실행한다고 가정합니다. 프로세스 간 통신은 까다로울 수 있습니다. 나는 항상 당신이 설명한 파이프 - 타입 캐스팅 방법을 사용하거나 로컬 소켓 시스템을 사용하여 데이터를 앞뒤로 보내지 만 프로세스 사이의 상위 레벨 통신을위한 라이브러리가 존재합니다. 자세한 내용은 boost.interprocess을 참조하십시오. 그것이 당신의 필요에 맞을 수 있는지보십시오.

0

최대한 멀리 귀하의 질문에 당신의 주요 문제를 일종의 직렬 연결을 통해 한 프로세스에서 다른 데이터를 전달하는 이해합니다.

위와 같은 경우 플랫 데이터 구조를 위아래로 지나가고 있다면 이미 설명한 방법을 사용하여 문제가 없어야합니다. 라인 아래로 전체 비트를 쏜 다음 라인의 다른 끝에있는 해당 유형으로 캐스트하십시오. 같은 컴파일러와 동일한 컴파일러 스위치로 생성 된 실행 파일을 사용하여 동일한 컴퓨터에서 실행되는 프로세스와 통신하는 경우에만 바이트 순서, 멤버 정렬 또는 기타 문제는 발생하지 않습니다.

다른 한편으로는 동적 길이 등의 다른 객체 목록에 대한 참조를 포함하는 데이터가 더 복잡하면 간단한 캐스트를 사용하여 큰 문제가 생기고 곧 데이터 비트를 펌핑합니다 비트 전략. 따라서 객체의 "직렬화"와 "비 직렬화"에서보다 정교한 접근법이 필요합니다.

이 ( "직렬화""직렬화") 가장 문제 맞는 방법을 찾아 더에 조사 할 수있는 두 용어가 있습니다.

곧 알 수 있듯이 이들은 "솔루션"이 Sun RPC 및 ASN.1에서 사용되는 XDR과 같은 표준의 동물원으로 계속해서 반복해서 고안되는 문제입니다. 귀하의 유스 케이스에 가장 적합한 것을 알려주십시오.

당신이 부스트가 제공하는 솔루션을 살펴 할 수 있습니다 ++ C로가는 경우 (참조 : http://www.boost.org/doc/libs/1_39_0/libs/serialization/doc/index.html를)

을 다시 한번 - 그냥 평면 데이터를 다시 전달하는 구조를인지 그 종류의 어떤 오버 헤드도 신경 쓰지 않고 조금씩 데이터를 줄이십시오.