c - 共享内存权限段 block c Linux

标签 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 吗?

感谢您的帮助。

最佳答案

是的,使用了两个进程,但据我读过几篇文章,使用 pthread mutex 代替信号量也是可能的。

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

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

关于c - 共享内存权限段 block c Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51915462/

相关文章:

c - 错误 - 使用 nmake 和 makefile.nt 在 Windows 7 上编译 Gnuplot

c++ - 共享库地址空间

linux - 获取上次执行命令的 PID(无背景)

c - 链接列表未按预期工作

Curl 内存缓冲区大小太小

c - 如何从 char[][] 写入文件?

c++ - C/C++ 中奇怪的数组到指针的转换

linux - 如何使用 sed 替换匹配列表

linux - 如何在不运行 ssh-agent 的情况下将 GitHub 与 SSH 结合使用?

linux - 神经节中的 "cpu_intr"和 "cpu_sintr"是什么意思