我正在尝试映射到具有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吗?
感谢您的帮助。
答案 0 :(得分:0)
是的,使用了两个进程,但是据我所读的几篇文章来看,也可以使用pthread互斥锁代替信号灯。
客户端打开共享内存并根据需要创建它。它使用了互斥锁,更新了数据值并释放了互斥锁。
我观察到的事情是,互斥锁被锁定或释放时,值会被修改。因此,我想到了内存重叠或未正确映射的部分。 B / R