我有几个结构,在堆上分配了另一个指针。我将多线程程序转换为多进程程序,因此我必须将堆上的结构转换为共享内存。到目前为止,除了问题之外我还遇到了问题。 MY TA建议我使用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;
};
我的malloc&#d; OverSharedData ,SharedData结构,fifo_t队列,以及稍后的多个char 指针。它们都必须被声明为共享内存吗?
答案 0 :(得分:0)
在malloc()
从堆请求内存的方式中,有系统调用(例如shmget()
)来请求/创建共享内存段。如果您的请求成功,您可以在那里复制您喜欢的任何内容。 (是的,您可以使用memcpy
。)但是请记住要小心指针,对于一个进程有效的指针,保存在其共享内存中,对于使用该共享内存段的其他进程不一定有效。
所有进程都可以访问共享内存以进行读取和/或写入。如果多个进程正在读/写共享内存段,那么,不用说,需要应用一些同步技术(例如信号量)。
请阅读共享内存。一个很好的来源是" Linux编程接口"作者:Michael Kerrisk
参考: