Linux的“共享内存权限”部分

时间:2018-08-19 07:28:07

标签: c linux

我正在尝试映射到具有2种不同权限的共享内存。

从服务器的角度来看,我正在读取整个共享内存数据部分,并读取/写入互斥锁部分以锁定/解锁共享内存。

从客户端的角度来看,我正在读写整个共享内存,因此这部分没有问题。

请参见下面的Shm.h文件中的C代码:

typedef struct 
{
    unsigned int Int1;
    unsigned int Int2;
    unsigned int Int3;
} DataType, *DataTypeHdlr;

typedef struct 
{
    DataType Data;
    pthread_mutex_t Mutex;
} MyShmType, *MyShmTypeHdlr;

从ShmRights.c(服务器的角度)来看的C代码:

#include <stdio.h>
#include "Shm.h"

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>

int main(void)
{
    int FileDesc;

    DataTypeHdlr MyDataHdler;       /* Data handler */
    pthread_mutex_t* MyMutexHdlr;   /* Mutex handler*/

    /* Init */
    MyDataHdler = NULL;
    MyMutexHdlr = NULL;

    /* Open the Shared memory Read for Data and Write for Mutex */
    FileDesc = shm_open("/Shm1", O_RDWR, 0660);

    /* Check the File Desc validity */
    if (FileDesc == -1)
    {
        printf("Error: Shm open\n");
        return -1;
    }

    /* Map into different memory regions */
    MyMutexHdlr  = mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, 
                                     MAP_SHARED, FileDesc, 0);

    MyDataHdler = mmap(NULL, sizeof(DataType), PROT_READ,
                            MAP_SHARED, FileDesc, sizeof(pthread_mutex_t));

    /* Check that the handler are valid */
    if (MyMutexHdlr == MAP_FAILED)
    {
        printf("Error: Mutex handler not valid\n");
        return -1;
    }

    /* Check that the handler are valid */
    if (MyDataHdler == MAP_FAILED)
    {
        printf("Error: Data handler not valid\n");
        return -1;
    }

    /* Simple code to take mutex and display shm values */
    pthread_mutex_lock(MyMutexHdlr);
    printf("Info: Int1:%d - Int2:%d -Int3:%d\n", MyDataHdler->Int1, MyDataHdler->Int2, MyDataHdler->Int3);
    pthread_mutex_unlock(MyMutexHdlr);

    return 0;
}

这样,我是否可以正确映射具有正确权限的共享内存部分?它也可以携带吗?

如何确保mmap函数返回的指针分别正确地映射到共享存储区中的数据和互斥区中?用DDD吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

是的,使用了两个进程,但是据我所读的几篇文章来看,也可以使用pthread互斥锁代替信号灯。

客户端打开共享内存并根据需要创建它。它使用了互斥锁,更新了数据值并释放了互斥锁。

我观察到的事情是,互斥锁被锁定或释放时,值会被修改。因此,我想到了内存重叠或未正确映射的部分。 B / R