我有几个结构体,它们在堆上分配了彼此的指针。我正在将多线程程序转换为多进程程序,因此我必须将堆上的这些结构放入共享内存中。到目前为止,我遇到的只是问题之上的问题。我的助教建议我使用 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;
};
我稍后对 OverSharedData、SharedData 结构和 fifo_t 队列以及多个 char 指针进行 malloc。它们都必须声明为共享内存吗?
最佳答案
在malloc()
从堆中请求内存的方式中,存在系统调用(例如shmget()
)来请求/创建共享内存段。如果您的请求成功,您可以在那里复制您想要的任何内容。 (是的,您可以使用memcpy。)但请记住要小心指针,保存在其共享内存中的对一个进程有效的指针不一定对使用该共享内存段的另一个进程有效。
所有进程都可以访问共享内存以进行读取和/或写入。如果多个进程正在读取/写入共享内存段,那么不用说,需要应用一些同步技术(例如信号量)。
请阅读共享内存。 Michael Kerrisk 的《Linux 编程接口(interface)》是一个很好的资料来源。
引用:
关于c - 有没有一种简单的方法将堆中的变量复制到共享内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23145802/