【发布时间】:2018-08-19 19:03:02
【问题描述】:
我正在尝试映射到具有 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 函数返回的指针正确映射到共享内存部分,分别是 Data 和 mutex 部分?用 DDD 吗?
感谢您的帮助。
【问题讨论】:
-
不清楚,这里的问题/问题是什么。请添加更多详细信息。
-
所以帖子没有完成。
-
如果我理解正确的话,您使用的是两个进程,对吗? (进程,没有线程)。如果是这样,引起我注意的第一件事就是将互斥锁与 pthread 一起使用,而不是 IPC 原语。使用线程时可以使用 pthreads 的互斥锁,但不能用于同步进程。客户端进程的代码是什么?最后,您所得到的以及您所期望的将有助于回答您的“问题”。请重写您的问题,使其更清楚。
-
如果您的设计基于两个进程,请对互斥体使用 IPC 原语。如果您的设计基于两个线程,请为互斥锁使用 pthreads 原语。如果你的设计基于两个线程,它们是共享内存的,你只需要同步对内存的访问。这对您的场景有意义吗?
-
在您的问题中,您说“从客户的角度来看,我正在读取和写入整个共享内存,所以这部分没有问题。”。您在服务器部分遇到了什么问题?