Linux 如何使用shmat确保在同一台机器上运行的两个不同应用程序连接到相同的起始地址

Linux 如何使用shmat确保在同一台机器上运行的两个不同应用程序连接到相同的起始地址,linux,c++11,ipc,shared-memory,Linux,C++11,Ipc,Shared Memory,我正在开发两个完全独立的应用程序,它们需要使用SystemV共享内存作为IPC的一种方式。在阅读之后,我似乎必须为这两个应用程序提供地址提示,以确保它们指向完全相同的内存位置。我将能够(几乎)保证他们都有相同的shmid,如下所述。所以我想知道,1。如果NULL作为第二个参数传递,0作为第三个参数传递,那么如果给定相同的shmid,我是否能够100%确定系统将两个应用程序指向内存中相同的起始位置?二,。如果没有,是否有办法在运行时找出系统用于共享内存的地址,以确保两个应用程序都使用不会导致shm

我正在开发两个完全独立的应用程序,它们需要使用SystemV共享内存作为IPC的一种方式。在阅读之后,我似乎必须为这两个应用程序提供地址提示,以确保它们指向完全相同的内存位置。我将能够(几乎)保证他们都有相同的shmid,如下所述。所以我想知道,1。如果NULL作为第二个参数传递,0作为第三个参数传递,那么如果给定相同的shmid,我是否能够100%确定系统将两个应用程序指向内存中相同的起始位置?二,。如果没有,是否有办法在运行时找出系统用于共享内存的地址,以确保两个应用程序都使用不会导致shmat失败的地址提示

正在使用的代码示例:

typedef struct
{
  uint8_t dataBuffer[SHARED_MEM_BUFFER_SIZE]; //8 byte char array
} SharedData;

typedef struct
{
  int32_t dataIndex;
  SharedData data;
} SharedDataStructure;

bool initialize()
{
  //Parse JSON file for key gen file path and char
  auto keyGenFilePath = ...//Parsed file path
  auto keyGenChar = ...//Parsed char

  //Both applications will be reading the exact same json file, to ensure
  //they both receive the same key.
  key_t sharedMemKey = ftok(keyGenFilePath.c_str(), keyGenChar[0]);
  if (sharedMemKey == -1)
  {
    //Log error
    return false;
  }

  //m_shMemId is an int, m_params is a std::vector<SharedDataStructure>
  m_shMemId = shmget(sharedMemKey, m_params.size() * sizeof(SharedData), IPC_CREAT | 0666);
  if (m_shMemId == -1)
  {
    //Log error
    return false;
  }

  //m_attachedSharedMem is a SharedData pointer
  m_attachedSharedMem = (SharedData *)shmat(m_shMemId, NULL, 0);
  if (m_attachedSharedMem == (void *)-1)
  {
    //Log error
    return false;
  }

  //Zero out shared memory
  return true;
}
typedef结构
{
uint8_t dataBuffer[SHARED_MEM_BUFFER_SIZE];//8字节字符数组
}共享数据;
类型定义结构
{
int32_t数据索引;
共享数据;
}共享数据结构;
bool初始化()
{
//为密钥gen文件路径和字符解析JSON文件
auto keyGenFilePath=…//已解析的文件路径
auto keyGenChar=…//已解析的字符
//两个应用程序将读取完全相同的json文件,以确保
//它们都接收相同的密钥。
key_t sharedMemKey=ftok(keyGenFilePath.c_str(),keyGenChar[0]);
如果(sharedMemKey==-1)
{
//日志错误
返回false;
}
//m_shMemId是一个int,m_params是一个std::vector
m_shMemId=shmget(sharedMemKey,m_params.size()*sizeof(SharedData),IPC_CREAT | 0666);
如果(m_shMemId==-1)
{
//日志错误
返回false;
}
//m_attachedSharedMem是一个SharedData指针
m_attachedsharedem=(SharedData*)shmat(m_shMemId,NULL,0);
如果(m_attachedsharedem==(void*)-1)
{
//日志错误
返回false;
}
//零输出共享内存
返回true;
}
另外,请注意,两个应用程序都将以这种方式初始化其共享内存(只有一个应用程序将内存归零)。这也是一个非常简单的系统,因此这两个应用程序将是唯一两个在操作系统之外使用共享内存的应用程序。此外,使用POSIX共享内存不是一个选项,不是因为系统限制,而是由于其他因素

我很抱歉不能提供一个复制粘贴可编译的示例,应用程序需要高度可配置,以避免将来出现更改代码