【问题标题】:Shared Memory initialise and access共享内存初始化和访问
【发布时间】:2016-02-15 17:00:51
【问题描述】:

我正在编写一个使用共享内存的客户端-服务器程序。我创建了一个 shm.c 和 shm.h 来使客户端和服务器文件更好。但是,我想知道如何在下面的代码中使用 accessSHM 初始化共享内存(因为我不知道如果有人能解释这一点,我怎么能达到它,那将非常有帮助)。

    #include <stdbool.h>
    #include <time.h>
    #include <sys/mman.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>

    #include "shm.h"

    char * getTimeStamp() {
        time_t ltime = time(NULL);
        return strtok(ctime(&ltime), "\n");
    }

    int createSHM(char * shname)
    {
     if ((shmid = shmget(key, sizeof(msg), IPC_CREAT)) < 0) {
    perror("shmget");
    exit(1);
    }

} int loadSHM(char * shname) {

 if (shname< 0)
 {
 printf("shmget error\n");
 exit(1);
 }
    }


    SHMstruct * accessSHM(int fd) {

    }


    SHMstruct * initSHM(int fd, SHMstruct *data) {

    }


    void clearSHM(SHMstruct * shm)
    {
    int status = munmap(shm, sizeof(SHMstruct));
    if (status ==-1){
    fprintf(stderr, "Failure in clearSHM",strerror(errno));
    exit(errno);

    }
    }

    void closeSHM(int fd)
    {
    int status = close(fd);
    if (status ==-1){
    fprintf(stderr, "Failure in closeSHM",strerror(errno));
    exit(errno);
    }
    }


    void destroySHM(char * shname)
    {
    int status = shm_unlink (shname);
    if (status ==-1){
    fprintf(stderr, "Failure in destroySHM",strerror(errno));
    exit(errno);
    }
    }

shm.h

    #ifndef _shm_h_
#define _shm_h_

#include <stdbool.h>

#define SHNAME "/shmserver" // shared memory
#define MAX_TICKETS 10
#define MAX_SLEEP 1 // seconds

typedef struct SHM {
    int ticket;
    bool isTaken;
    bool soldOut;
} SHMstruct;

extern char * getTimeStamp();

extern int createSHM(char *shname);
extern int loadSHM( char *shname);

extern SHMstruct* initSHM( int fd, SHMstruct *data);
extern SHMstruct * accessSHM(int fd);

extern void clearSHM(SHMstruct * shm);
extern void closeSHM(int fd);
extern void destroySHM(char * shname);

#endif

【问题讨论】:

  • 函数createSHMclearSHM 错过了结束}

标签: c++ c shared-memory


【解决方案1】:

共享内存是一个相当大的话题;仅仅说“这就是你打开它的方式”真的是不够的。在自己编写之前,您可能需要确保自己需要这样做。

有几个库,包括 Boost 进程间,提供了一个围绕创建和访问共享内存的包装器。在决定自己编写之前,您可能想看看那里。

如果您不能使用 Boost(或其他一些库),并且真的必须自己编写一个,请记住,您还需要提供一种同步(锁定)方法,以便读取和写入'不会从多个进程同时发生。我建议查看其中一些库中的一些代码,甚至是 stackoverflow 上的代码:A simple shared memory application written on Linux 以了解基础知识,但只要了解这将是相当多的代码才能获得一个工作库.

【讨论】:

    【解决方案2】:

    您可以使用 shmat 调用附加并获取地址。

    p_mem = (message *) shmat(shmid,0,0);
    

    在这个例子中,message 是一个结构。您可以使用任何数据类型。 p_mem 和其他指针一样。

       char *p_mem;
       p_mem = (char *) shmat(shmid,0,0);
       strcpy(p_mem, "test");
    

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多