【发布时间】:2016-05-08 20:27:39
【问题描述】:
我想写一些函数void* share(void*, int),它应该设置共享内存来共享指针处的数据。
我的第一次尝试看起来像(没有检查等):
void* share(void *toBeShared, int size) {
int fd = shm_open(SHM_NAME, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
ftruncate(fd, size);
return mmap(toBeShared, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
}
但这似乎并不如我所愿。第二次尝试是这样的:
void* share(void *toBeShared, int size) {
void *mem = NULL;
int fd = shm_open(SHM_NAME, O_CREAT | O_RDWR | O_EXCL, S_IRUSR | S_IWUSR);
ftruncate(fd, size);
mem = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)
memcpy(mem, toBeShared, size);
return mem;
}
这确实有效,但我需要复制整个数据,我想避免这样做。
因此我的问题是:有没有办法共享已经分配的内存(如果可能的话,不必复制太多),如果可以,怎么做?
提前致谢。
PS:我见过更多这样的问题(例如here 和here),但那里没有给出答案。
编辑:
我想如何使用它:
typedef struct {
char *name;
int status;
} MyTask;
int main(int argc, char** argv) {
MyTask* taskList = NULL, sharedTaskList = NULL;
int length = 0;
...
readFile(&taskList, &length, ...);
sharedTaskList = share(taskList, length * sizeof(MyTask));
// or maybe even better: without needing to assign it to new variable
for(i = 0; i < NR_WORKERS; i++) {
switch(pid = fork()) {
//etc...
}
}
...
return 0;
}
【问题讨论】:
-
答案取决于现有的映射是什么。是文件映射吗?是匿名的吗?试图回答每一个可能的情况将是非常乏味的。这将有助于了解您的实际应用。它也将是特定于操作系统的,因为并非所有应该工作的东西都在每个操作系统上实现。 (例如,由于某种原因,Linux 不允许您映射
/proc/*/mem。) -
@DavidSchwartz 它实际上只是一个带有结构的简单数组。我试图将我的函数写得尽可能通用......
-
@MrTsjolder 这个数组是怎么分配的?为什么一开始没有在共享内存中分配它?它是否包含任何指针?
-
您无法做到这一点,因为您无法满足的边界条件太多。
标签: c posix shared-memory