C 有没有一种简单的方法可以将堆中的变量复制到共享内存中

C 有没有一种简单的方法可以将堆中的变量复制到共享内存中,c,multiprocessing,shared-memory,C,Multiprocessing,Shared Memory,我在堆上分配了两个相互指向的结构。我正在将多线程程序转换为多进程程序,因此我必须将堆上的结构转换为共享内存。到目前为止,除了问题之外,我什么也没碰到。我的助教建议我使用memcpy,但我不确定这是否有效。有没有办法将堆上的一组结构转换为共享内存 我正在使用的结构: struct SharedData { int da; int isopen; int refcount; // reference count: number of threa

我在堆上分配了两个相互指向的结构。我正在将多线程程序转换为多进程程序,因此我必须将堆上的结构转换为共享内存。到目前为止,除了问题之外,我什么也没碰到。我的助教建议我使用memcpy,但我不确定这是否有效。有没有办法将堆上的一组结构转换为共享内存

我正在使用的结构:

 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的数组