필자는 두 개의 프로그램 중 아주 작은 예가 있습니다. 하나는 공유 메모리 세그먼트를 쓰고 다른 하나는 읽는 것입니다. std::string
(및 기타 컨테이너)과 관련하여 잠재적으로 문제가 있음을 알고 있으므로 인 boost::interprocess::string
을 시도했습니다. 나는 이것이 정말로 근본적이고 단순한 무엇인가를 놓치고 있다고 확신하지만 그것을 볼 수 없다!부스트 IPC 문자열 길이 segfault?
어쨌든 시놉시스는 문자열이 작을 때 (첫 번째 프로그램은 SSO보다 크다고 생각하지만) 첫 번째 프로그램을 실행하면 메모리가 쓰고 두 번째는 완전히 잘 읽습니다. 그러나이 예제 에서처럼 문자열을 꽤 크게 만들면 읽기 프로그램 segfaults가 발생합니다. 모두 writeipc.cc 아래. 코드를 읽고 쓸 동일한 프로세스에 있지만 다른 기능은 (그래서 IPC를 통해 제외한 모든 데이터를 공유하지 않으면 나는이 함께 성공을
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <iostream>
#include <utility>
int main()
{
typedef boost::interprocess::string bi_string;
boost::interprocess::shared_memory_object::remove("Test");
boost::interprocess::managed_shared_memory managed_shm(boost::interprocess::create_only, "Test", 65536);
bi_string* i = managed_shm.construct<bi_string>("string")("abcdefghijklmnopqrstuvwxyzaskl;dfjaskldfjasldfjasdl;fkjwrotijuergonmdlkfsvmljjjjjjjjjjjjjj"); // make smaller (ie "jjjjjjjjjjjjjj" and test passes
std::cout << "inserting into shm" << *i << std::endl;
std::pair<bi_string*, size_t> q = managed_shm.find<bi_string>("string");
std::cout << *q.first << std::endl;
while(true)
std::cout << "still running"; // hack to keep process running (not required)
}
readipc.cc
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <iostream>
int main()
{
typedef boost::interprocess::string bi_string;
boost::interprocess::managed_shared_memory managed_shm(boost::interprocess::open_only, "Test");
std::pair<bi_string*, std::size_t> p = managed_shm.find<bi_string>("string");
std::cout << "existing value" << *p.first << std::endl;
}
'쓰기'가 완료된 후 * '읽었습니까?' – Jarod42
예, 물론입니다. 나는 할당 자에게 아마도 그렇게 생각한다. 나는이 배경을 더 자세히 살펴볼 것이지만, ipc 문자열을 사용하고 ipc :: string에서 std :: string 또는 무엇이든 어쩌면 포드 유형으로 전환하는 것이 가장 쉽습니다. – dirvine