[英]Sharing memory between processes on linux
我有使用多个进程的服务器( fork()
)。 有大量数据块,它们可以由一个进程创建,并且应该在其他进程之间共享。
因此,我使用shm_open + mmap创建共享内存并将其映射到虚拟内存。
struct SharedData {
const char *name;
int descriptor;
void *bytes;
size_t nbytes;
}
void shared_open(SharedData *data, const char *name, size_t nbytes) {
int d = shm_open(name, O_RDONLY, S_IRUSR | S_IWUSR);
if (d != -1) {
void *bytes = mmap(NULL, nbytes, PROT_READ, MAP_SHARED, d, 0 );
data->name = name;
data->descriptor = d;
data->bytes = bytes;
data->nbytes = nbytes;
} else {
data->descriptor = -1;
}
}
void shared_create(SharedData *data, const char *name, void *bytes, size_t nbytes) {
int d = shm_open(name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
if (d != -1) {
if (nbytes = write(d, bytes, nbytes)) {
shared_open(data, name, nbytes);
}
shm_unlink(name);
}
}
void shared_close(SharedData *data) {
if (data->descriptor != -1) {
munmap(data->bytes, data->nbytes);
shm_unlink(data->name);
}
}
初始进程使用shared_create
创建共享内存对象,其他进程使用shared_open
打开它
这种方法有效吗? 有更有效或更简单的方法吗?
您的设计看起来很合理。 为了遵守API的POSIX准则以共享内存,您应该使用ftruncate
而不是write
来扩展大小,请参见
http://man7.org/linux/man-pages/man7/shm_overview.7.html
您始终可以执行memcpy初始化内容。
如果您使用的是c ++,则可以使用boost进程间,如果没有别的,可以看看它们的接口。
http://www.boost.org/doc/libs/1_51_0/doc/html/interprocess/sharedmemorybetweenprocesses.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.