我想在虚拟内存中创建一些缓冲区,我想在另一个应用程序中使用它的相关物理内存。
#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/