簡體   English   中英

共享內存的初始化和訪問

[英]Shared Memory initialise and access

我正在編寫使用共享內存的客戶端服務器程序。 我創建了一個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

共享內存是一個相當大的話題。 僅僅說“這就是打開方式”確實是不夠的。 在自己寫書之前,您可能需要確保自己需要做。

有幾個庫,包括Boost進程,提供了創建和訪問共享內存的包裝。 在決定編寫自己的書之前,您可能需要先看看那里。

如果您不能使用Boost(或其他庫),而實際上必須自己編寫一個,請記住,您還需要提供一種同步(鎖定)方法,以免發生讀寫操作同時來自多個流程。 我建議您查看其中一些庫中的某些代碼,或者甚至從此處在stackoverflow上查看代碼: 在Linux編寫的一個簡單的共享內存應用程序,以獲取基礎知識,但是只要知道這將是很多代碼即可得到一個工作圖書館。

您可以使用shmat調用附加並獲取地址。

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

在此示例中,消息是一個結構。 您可以使用任何數據類型。 p_mem就像其他任何指針一樣。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM