【问题标题】:Shared memory rights section block c Linux共享内存权限部分块 c Linux
【发布时间】: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 原语。如果你的设计基于两个线程,它们是共享内存的,你只需要同步对内存的访问。这对您的场景有意义吗?
  • 在您的问题中,您说“从客户的角度来看,我正在读取和写入整个共享内存,所以这部分没有问题。”。您在服务器部分遇到了什么问题?

标签: c linux


【解决方案1】:

是的,使用了两个进程,但就我阅读了几篇文章而言,也可以使用 pthread 互斥锁代替信号量。

客户端打开共享内存并在需要时创建它。它获取了互斥体,更新数据的值并释放互斥体。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-17
    • 2011-02-18
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多