首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享内存类

共享内存类
EN

Code Review用户
提问于 2020-02-05 03:36:37
回答 2查看 114关注 0票数 2

我编写了一个类,它打开一个共享内存通信,用于我的项目,并希望得到一个评论。

mylib_com.hpp

代码语言:javascript
复制
#ifndef __MYLIB_COM_HPP
#define __MYLIB_COM_HPP

#include <sys/mman.h>   /* For mmap */
#include <fcntl.h>      /* For O_* in shm_open */
#include <unistd.h>     /* For ftruncate and close*/
#include <string.h>     /* For strcpy*/
#include <string>

namespace Myns{
    class Channel{
        public:
            Channel(std::string name, size_t size = sizeof(char)*50);
            ~Channel();
            void write(const char * msg);
            std::string read();
        private:
            int memFd;
            int res;
            u_char * buffer;
    };  
}

#endif

mylib_com.cpp

代码语言:javascript
复制
#include "mylib_com.hpp"
#include <errno.h>
#include <system_error>

Myns::Channel::Channel(std::string name, size_t size){
    memFd = shm_open(name.c_str(), O_CREAT | O_RDWR, S_IRWXU);
    if (memFd == -1)
    {
        perror("Can't open file");
        throw std::system_error(errno, std::generic_category(), "Couldn't open shared memory");
    }

    res = ftruncate(memFd, size);
    if (res == -1)
    {
        perror("Can't truncate file");
        close(memFd);
        throw std::system_error(errno, std::generic_category(), "Couldn't truncate shared memory");
    }

    buffer = (u_char *) mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, memFd, 0);
    if (buffer == NULL)
    {
        perror("Can't mmap");
        close(memFd);
        throw std::system_error(errno, std::generic_category(), "Couldn't mmap shared memory");
    }
}

Myns::Channel::~Channel(){
    close(memFd);
}

void Myns::Channel::write(const char * msg){
    strcpy((char*)buffer,msg);
}
```
代码语言:javascript
复制
EN

回答 2

Code Review用户

回答已采纳

发布于 2020-02-05 11:34:49

  • __MYLIB_COM_HPP是一个保留标识符,您不允许在代码中使用这些标识符。
  • 与其同时包含<string><string.h>,您还可以使用std::strcpy()。另外,您不需要在标头中这样做,将其移动到实现文件中。
  • 根据定义,sizeof (char)是1,因为sizeof给出的大小是char的倍数。那部分基本上是多余的。
  • 输出perror()错误并将其作为异常抛出也是多余的。如果捕捉到错误时不记录错误,那么您就是一个傻瓜,或者有理由忽略它,但是您不能在错误发生的地方做出这个决定。
  • 你在使用C风格的转换。不要使用C++强制转换(这里的情况下是static_cast)。
  • 我不知道u_char是什么,那可能是不可移植的。
  • 完全避免转换:mmap()返回void*,您将其转换为u_char*并存储在缓冲区中。在使用buffer的唯一情况下,首先将其转换为char*。不要,只需保留一个void*,并且只在需要时进行强制转换。
  • 您在编写时没有错误检查。您只需使用char const*并将其提供给strcpy(),而不进行任何边界检查。
票数 3
EN

Code Review用户

发布于 2020-02-05 21:56:41

再加几分..。

我没有使用c++17,但是在对常量执行测试时,请考虑将常量放在左边而不是右边。这样就可以防止排字产生意想不到的后果。if (res = -1)更改res的值,而if(-1 = res)不编译。

您在类中保留了似乎不需要的变量。如果它们仅用于构造函数,则使用局部变量。也许您有其他的计划,但是res看起来特别可疑,因为如果类已经被构造,并且在您提供的代码中,它将永远不会被读取,所以它将始终是0

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/236684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档