C使用共享内存传递void指针

我需要将void处理程序传递给另一个应用程序,为了复制场景我使用共享内存创建了一个小程序并尝试将void指针传递给另一个应用程序并打印该值,我可以在另一个应用程序中获取void指针地址,但是当我尝试取消引用指针第二个应用程序崩溃时。

以下是示例应用程序wire.c。

#include  #include  #include  int main() { key_t key=1235; int shm_id; void *shm; void *vPtr; shm_id = shmget(key,10,IPC_CREAT | 0666); shm = shmat(shm_id,NULL,NULL); sprintf(shm,"%d",&vPtr); printf("Address is %p, Value is %d \n", (void *)&vPtr, * (int *)vPtr); return; } 

这是read.c

 #include  #include  #include  #include  int main() { key_t key=1235; int shm_id; void *shm; void *p = (void *)malloc(sizeof(void)); shm_id = shmget(key,10,NULL); shm = shmat(shm_id,NULL,NULL); if(shm == NULL) { printf("error"); } sscanf(shm,"%d",&p); printf("Address is %p %d\n",(void *)p); return 0; } 

当我试图取消引用它崩溃。 我需要在第二个应用程序中传递void指针地址和值。

我不想在应用程序之间共享价值,我知道它使用共享内存。

默认情况下,void * ptr会有一些garbadge值(例如add = 0xbfff7f,value = 23456),你能告诉我,我怎样才能将void指针地址传递给另一个应用程序,并从第二个应用程序使用该地址我可以打印第一次申请中发现的价值(即23456)。

除共享内存外还有其他备用内存吗?

谢谢。

这可能是因为指针仍然是虚拟的; 它指向共享的内存,但不能保证共享同一内存的两个进程将其映射到同一个虚拟地址。 物理地址当然是相同的(毕竟它是相同的实际内存)但是进程从不处理物理地址。

您可以尝试使用mmap() (在Linux中)进行共享来请求特定地址。 您还可以通过在两个进程中打印共享内存块的地址来validation虚拟地址理论。

另外, 不要在C中转换malloc()的返回值,并且在要使用共享内存时不要分配内存。 那部分没有任何意义。

如果要从另一个进程调用进程内的函数,则不是IPC。
IPC是在多个线程/进程之间共享数据

考虑将共享函数添加到DLL /共享对象中以跨进程共享代码。 如果没有,那么您可以向可执行文件添加RPC支持,如下所示。


为什么在2个进程之间传递函数指针不起作用?

函数指针是指代function代码当前加载到物理存储器中的物理存储器位置的虚拟地址。 每当在进程中引用函数指针(虚拟地址)时,内核负责执行到物理地址的映射。 这是成功的,因为映射存在于当前进程的页表中。

但是,当发生上下文切换并且另一个进程正在运行时,包含该特定进程的映射的页表将被加载并且当前处于活动状态。 这些将不包含从前一个进程的函数指针的映射。 因此,尝试使用来自另一个进程的函数指针将失败。

为什么页表不包含另一个进程中的函数映射?

如果这样做,那么拥有多个流程就没有优势。 所有可能运行的代码都必须同时加载到物理内存中。 此外,整个系统实际上将是一个单一的过程。

实际上,每当发生上下文切换并且正在执行不同的进程时,先前进程的代码/数据段甚至可以从物理内存中换出。 因此,即使维护函数指针并将其传递给新进程也是无用的,因为即使在内存中加载较新的进程并开始执行之后,它也无法保证function代码将保留在内存中。

这是非法的:

 void *p = (void *) malloc(sizeof(void)); 

void是一个不完整的类型, sizeof(void)无效。 出于与无法声明void变量相同的原因,您无法执行此操作:

 void i; /* WRONG */ 

取消引用p时会发生什么是未定义的。 如果你只想要指针值,你不需要在read.c上调用malloc – 这就是共享内存的整个概念 – 如果它是共享的,你为什么要在阅读器程序上分配空间?