2014-03-12 2 views
0

공유 메모리를 사용하여 프로세스간에 벡터를 공유하고 있습니다.공유 메모리 유효 기간을 늘리십시오.

클라이언트에서 공유 메모리를 열어 벡터를 읽은 다음 메모리가 유효하지 않거나 내가 찾고있는 것이 아닌 경우 어떻게 알 수 있습니까?

메모리 세그먼트가 없으면 Open_Only이 실패하고 그렇다면 어떻게 실패합니까?

또한 공유 메모리 세그먼트는 참조가없는 경우 제거되어야합니다. 그러나 제 경우에는 클라이언트와 서버가 모두 종료 되어도 공유 메모리에 액세스하는 것이 없지만 세그먼트는 프로그램 데이터의 Boost Interprocess 폴더에 일부 데이터와 함께 유지됩니다. 따라서 클라이언트가 다음에 시작할 때 세그먼트를 여는 데 아무런 문제가 없으므로 실제로 공유 할 데이터가 없을 때 올바른 데이터에 액세스하고 있다고 생각합니다.

친절히 조언하십시오. 고맙습니다.

답변

0

기본 SHM API를 경험에서 말하기 - 아닌 부스트 전문가로 ...

가 유효성을 확인하려면, 하나 개의 기술은 현재의 프로세스가 공유 메모리를 생성하는 하나의 경우 파악하는 것입니다 (처음). 생성 (fstat) 후 크기를 가져 와서 크기가 0인지 확인하면됩니다. 값이 0이면 프로세스가이를 작성합니다. 일단 당신이 그것을 초기화 할 수 있다는 것을 알게된다. 또한 truncate()를 호출하여 여기에 크기를 설정하면 해당 크기가 다른 모든 프로세스에 설정됩니다.

제거를 위해 shm_unlink()를 호출하여 시스템에서 공유 메모리 파일을 제거 할 수 있습니다. Boost에는 제거() API가 있다고 믿습니다.

+0

크기에 대해 잘 모르겠습니다. 어떤 경우에는 크기를 0으로했지만 용량은 올바른 숫자로 지정했습니다. 그걸 수표로 사용하는 것은 확실하지 않습니다. Boost에는 세그먼트 구축기가 있지만, 모든 링크가 제거 된 경우에만 작동합니다. 따라서 서버가 아무 것도하지 않고 꺼버릴 때 클라이언트가 공유 메모리를 참조하는 것을 멈추고 오류를 알리는 이유는 무엇입니까? – user1173240

+0

공유 메모리 수준에서는 서버에 클라이언트가 있다는 것을 알리는 메커니즘이 없습니다. 사실, 서버 대 클라이언트의 개념은 없습니다. 기본적으로 프로세스간에 공유되는 메모리 조각입니다. 다른 메커니즘이 그 위에 구축됩니다. shm 파일이 사용 중일 때/dev/shm 폴더를 표시합니까? – YasserAsmi

+1

또 다른 아이디어는 공유 메모리에 항상 매번 숫자 (타임 스탬프?)를 증가시키는 일종의 것을 쓰는 것입니다. 고객이 가진 가치와 비교하십시오. – YasserAsmi