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

标签 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; 
} 

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

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

这种做法对吗? 任何线索都会很有帮助。

最佳答案

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

关于c - 在 Linux 中使用共享内存通过 IPC 创建的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53474854/

相关文章:

在我的 'writing a file' 程序中找不到错误

linux - Jenkins 上的 RPM 构建在更新的模拟版本上失败,而不是在成功的工作站上进行模拟

linux - putty - 需要最近的标准输出

c - 测试内存碎片

android phonegap 应用程序在加载太多 javascript 时失败

c - 如何获取DSTH01 I2C通信的设备ID?

c - 这段 C 代码是做什么的?

c - 添加 request_mem_region 后,我的驱动程序每次第一次访问都会失败,并显示 "busy"消息

无法在 OpenCV 中将 Gray 转换为 BGR

linux - 如何使用 ssh 打开监视 Raspbian/Raspberry?