在Linux中使用通过IPC的共享内存创建的缓冲区

时间:2018-11-26 04:38:57

标签: c linux memory-management ipc shared-memory

我想在虚拟内存中创建一些缓冲区,并希望在其他应用程序中使用其相关的物理内存。

#include <stdio.h> 
#include <sys/shm.h> 
#include <sys/stat.h> 

int main () 
{
  int segment_id; 
  char* shared_memory; 
  struct shmid_ds shmbuffer; 
  int segment_size; 
  const int shared_segment_size = 0x6400; 
  int key = 1234;
  segment_id = shmget (key, shared_segment_size, 
                 IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); 
  shared_memory = (char*) shmat (segment_id, 0, 0); 
  printf ("shared memory attached at address %p\n", shared_memory); 
  segment_size  =               shmbuffer.shm_segsz; 
  printf ("segment size: %d\n", segment_size); 
  /* Write a string to the shared memory segment.  */ 
  sprintf (shared_memory,"%p" shared_memory); 
 while(1)){}
return 0;
}

在上面的示例中,我创建了缓冲区,并将该缓冲区的起始地址传递给另一个应用程序,我想将该地址用作另一个应用程序中其他函数的起始地址。例如。

#include <iostream> 
#include <sys/ipc.h> 
#include <sys/shm.h> 
#include <stdio.h> 
using namespace std; 

int main() 
{ 
    int shmid = shmget(1234,0x6400,PC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); 
    char *str = (char*) shmat(shmid,(void*)0,0); 

    printf("Data read from memory: %s\n",str); 
      /// USE THIS str (address passed from previous application)
    shmdt(str); 
    shmctl(shmid,IPC_RMID,NULL); 

    return 0; 
} 

我可以在另一个应用程序中使用我从共享内存传递的地址吗(上图)?

我想将我从共享内存应用程序中获取的虚拟地址转换为物理内存并使用。

这种方法正确吗? 任何线索都会有很大帮助。

1 个答案:

答案 0 :(得分:1)

可以通过键在不同进程之间访问共享内存。 当使用密钥和IPC_CREAT创建一个密钥时,只使用不带IPC_CREAT的相同密钥就可以访问内存。每个进程将在共享内存的同一物理内存上拥有其单独的虚拟内存。 不需要将地址从一个进程传递到另一个进程,只需密钥就足够了。如果需要创建虚拟内存块,只需猜测mmap()函数可以提供帮助,但是引用其man / info页面将有所帮助。