2012-08-11 2 views
6

좋은 하루 일하는 사람들,64bit 및 32bit 프로세스 간 통신 boost :: message_queue

현재 64 비트 프로세스와 32 비트 프로세스간에 데이터를 전달하는 방법을 생각하고 있습니다. 실시간 응용 프로그램이기 때문에 둘 다 같은 컴퓨터에서 실행되므로 공유 메모리 (shm)를 사용하기가 어렵습니다.

shm을 사용하여 동기화 메커니즘을 찾고 있는데 boost :: message_queue에서 느꼈습니다. 그러나 그것은 작동하지 않습니다.

보낸 사람 부분이 개 프로세스가 64 비트 또는 32 비트 경우

message_queue mq(open_only, "message_queue"); 
for (uint8_t i = 0; i < 100; ++i) 
{ 
    uint8_t v; 
    size_t rsize; 
    unsigned int rpriority; 
    mq.receive(&v, sizeof(v), rsize, rpriority); 
    std::cout << "v=" << (int) v << ", esize=" << sizeof(uint8_t) << ", rsize=" << rsize << ", rpriority=" << rpriority << std::endl; 
} 

이 코드가 완벽하게 작동

message_queue::remove("message_queue"); 
message_queue mq(create_only, "message_queue", 100, sizeof(uint8_t)); 
for (uint8_t i = 0; i < 100; ++i) 
{ 
    mq.send(&i, sizeof(uint8_t), 0); 
} 

수신기 부분 :

내 코드는 기본적으로 다음과 같다. 하지만 두 프로세스가 같지 않으면 작동하지 않습니다. 후원에 깊은 찾고

(1.50.0) 코드는 다음 message_queue_t 라인 :: do_receive를 볼 수 있습니다 (부스트/간/IPC/message_queue.hpp) : 어떤 이유

scoped_lock lock(p_hdr->m_mutex);

의에서 mutex는 이기종 프로세스로 작업 할 때 잠긴 것처럼 보입니다. 내 생각에 뮤텍스는 상쇄되어 값이 손상되었지만 확실하지는 않습니다.

단순히 지원되지 않는 작업을 수행하려고합니까?

도움이나 조언을 주시면 감사하겠습니다.

+1

이것은 정확하지 않습니다. 그들은 뮤텍스를 공유 메모리에 넣고 크기가 비트 수에 달려있는 멤버를 선행합니다. 이 일을 할 수는 없습니다. –

답변

5

이것은 헤더 뮤텍스를 포함하여 각 메시지를 가리 키기 위해 message_queue에 사용 된 offset_ptr의 이식성이라고 생각합니다. https://svn.boost.org/trac/boost/ticket/5230에서 언급 한 바와 같이 Boost 1.48.0부터 32/64 비트 상호 운용성이 지원되어야합니다.

이 MSVC에서 부스트 1.50.0에
typedef message_queue_t< offset_ptr<void, int32_t, uint64_t> > interop_message_queue; 

이 또한 message_queue의 작은 패치를 필요로 보인다 티켓 제안, 다음과 같은 정의가 (지금까지)가 다음

message_queue의 leiu에 나를 위해 잘 작동 .hpp를 사용하여 템플릿 모호성을 해결합니다. ipcdetail :: get_rounded_size (...) 호출에서 인수를 캐스팅합니다.

+0

감사합니다, 제임스! 출처를 보면, 그 템플릿 오류는 [1.57] (http : //www.boost.org/doc/libs/1_57_0/boost/interprocess/ipc/message_queue.hpp)하지만 여전히 [1.56]에 있습니다 (http://www.boost.org/doc/libs/1_56_0/boost/interprocess/ipc/message_queue .hpp). –

1

저는 솔루션을 통해 평생 동안의 모습을 보았습니다. 이 솔루션은 부분적으로 James가 제공 한 것이므로 32 비트 및 64 비트 프로세스에서 interop_message_queue를 사용했습니다.

typedef boost::interprocess::message_queue_t< offset_ptr<void, boost::int32_t, boost::uint64_t>> interop_message_queue; 

문제는이 수정과 코드가 컴파일하지 않을 것이라고, 그래서 나는 또한 내가 부스트 버그 보고서 목록 (#6147: message_queue sample fails to compile in 32-bit)에있는 다음을 추가했다,이 코드는 전에 장소이어야한다 부스트는 message_queue를 포함합니다 :

namespace boost { 
    namespace interprocess { 
    namespace ipcdetail { 
     //Rounds "orig_size" by excess to round_to bytes 
     template<class SizeType, class ST2> 
     inline SizeType get_rounded_size(SizeType orig_size, ST2 round_to) { 
     return ((orig_size-1)/round_to+1)*round_to; 
     } 
    } 
    } 
}