在Linux上在进程之间共享内存

3

我有一台服务器,使用多个进程(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打开它。

这种方法是否有效?是否存在更有效或更简单的方法?


你是否知道fork使用写时复制策略?内存页面在进程修改之前是共享的。 - zch
每次只能有一个进程创建共享数据,并且对于其他进程而言,该数据是只读的。只有在fork阶段后才能创建共享数据。 - SBKarr
你在代码实现方面有特定的问题吗?如果没有,那么你的问题应该转到 Code Review 网站。 - Hristo Iliev
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接