共享内存

SharedMemory.h
#ifndef SHAREDMEMORY_H
#define SHAREDMEMORY_H

namespace Utility
{

//获取shmId
int initShm(const char* fileName);

//清除shmId
int closeShmMessage(int shmId);

//向shmId写数据
int writeShmMessage(int shmId,const void* msg,int msgLen);

//从shmId读数据
void* readShmMessage(int shmId);

}//end of namespace Utility

#endif // SHAREDMEMORY_H


SharedMemory.cpp
#include "SharedMemory.h"
#include <sys/types.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

namespace Utility
{

/*
    获取shmId
*/
int initShm(const char* fileName)
{
    if(access(fileName,R_OK)!=0)
    {
        int fd = open(fileName,O_RDWR|O_CREAT|O_APPEND);
        close(fd);
    }
    key_t key = ftok(fileName,0);
    if(key==-1){
        return -1;
    }
    return shmget(key,4096,IPC_CREAT);
}

/*
    清除shmId
*/
int closeShmMessage(int shmId)
{
    return shmctl(shmId,IPC_RMID,0);
}

/*
    向shmId写数据
*/
int writeShmMessage(int shmId,const void* msg,int msgLen)
{
    void *pmessage = shmat(shmId,NULL,0);
    memcpy(pmessage, msg, msgLen);
    if(shmdt(pmessage)==-1){
        return -1;
    }
    return 0;
}

/*
    从shmId读数据
*/
void* readShmMessage(int shmId)
{
    return shmat(shmId,NULL,0);
}

}//end of namespace Utility



testSharedMemory.cpp
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>
#include <stdlib.h>
#include "SharedMemory.h"
using namespace std;
using namespace Utility;

struct Message
{
    int m;
    char str[32];
};

static const char* g_file = "testShm";

int main()
{
    Message msg1;
    msg1.m = 1;
    strcpy(msg1.str,"hello");
    int shmId = initShm(g_file);
    if(shmId<0)
    {
        cout << "shmget error" << endl;
        return -1;
    }

    pid_t pid;
    if((pid=fork())==0)
    {
        writeShmMessage(shmId,&msg1,sizeof(msg1));
        exit(0);
    }
    if(waitpid(pid,NULL,0)!=pid)
    {
        cout << "wait error" << endl;
        return -1;
    }
    Message* msg2 = (Message* )readShmMessage(shmId);
    cout << msg2->m << "," << msg2->str << endl;
    cout << "clear:" << closeShmMessage(shmId) << endl;
    return 0;
}


1,hello
clear:0

猜你喜欢

转载自xiangjie88.iteye.com/blog/2117265