C 有没有一种简单的方法可以将堆中的变量复制到共享内存中
我在堆上分配了两个相互指向的结构。我正在将多线程程序转换为多进程程序,因此我必须将堆上的结构转换为共享内存。到目前为止,除了问题之外,我什么也没碰到。我的助教建议我使用memcpy,但我不确定这是否有效。有没有办法将堆上的一组结构转换为共享内存 我正在使用的结构:C 有没有一种简单的方法可以将堆中的变量复制到共享内存中,c,multiprocessing,shared-memory,C,Multiprocessing,Shared Memory,我在堆上分配了两个相互指向的结构。我正在将多线程程序转换为多进程程序,因此我必须将堆上的结构转换为共享内存。到目前为止,除了问题之外,我什么也没碰到。我的助教建议我使用memcpy,但我不确定这是否有效。有没有办法将堆上的一组结构转换为共享内存 我正在使用的结构: struct SharedData { int da; int isopen; int refcount; // reference count: number of threa
struct SharedData {
int da;
int isopen;
int refcount; // reference count: number of threads using this object
unsigned int front; // subscript of front of queue
unsigned int count; // number of chars in queue
unsigned int bufsize;
pthread_cond_t buffer_full;
pthread_cond_t buffer_empty;
pthread_mutex_t mtex;
fifo_t* queue;
sem_t empty_count;
sem_t full_count;
sem_t use_queue; // mutual exclusion
};
struct OverSharedData{
struct SharedData ** rep;
int rop;
};
后来,我用多个char指针替换了SharedData、SharedData结构和fifo\t队列。它们都必须声明为共享内存吗 在malloc从堆请求内存的方式中,存在系统调用,例如shmget请求/创建共享内存段。如果你的请求成功,你可以在那里复制你喜欢的任何东西。是的,你可以使用memcpy。但是记住要小心指针,一个对一个进程有效的指针,保存在它的共享内存中,不一定对另一个使用该共享内存段的进程有效
共享内存可供所有读取和/或写入进程访问。如果多个进程正在读/写共享内存段,那么,不用说,需要应用一些同步技术,例如信号量
请仔细阅读共享内存。Michael Kerrisk的Linux编程接口是一个很好的源代码
参考:
如果您使用的是共享内存,最好的选择可能是将偏移量用于数组,而不是指针。如果共享内存在所有进程中都位于同一地址,并且共享内存中的所有指针都是指向共享内存中其他位置的指针,那么您可以简单地复制周围的数据。但是,您不能将进程A中共享内存外部的指针复制到共享内存中,并期望进程B能够使用这些指针——这根本无法可靠地工作。@JonathanLeffler您所说的偏移量是什么意思?数组索引。您可以定义指向共享内存段中各种结构数组的基指针,并将其索引到这些数组中,然后记录数组索引而不是指针。在64位机器上,这通常更节省空间。共享内存中有多少数组的条目超过20亿个,可能不多,因此可以使用32位偏移量而不是64位指针。最大的优点是,只要正确地建立了基址,即使进程A中的基址为0x70000000,进程B中的基址为0x80000000,相同的偏移量也可以工作。每次我想malloc时是否必须使用shmget和shmat?@AbhishekSaha:技术上是,但通常不是。通常,你会得到一大块内存,然后自己管理。例如,您可以将其强制转换为结构A,其中可能包含结构B的数组