`

共享内存

 
阅读更多
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
分享到:
评论

相关推荐

    C# 进程间通信 共享内存

    共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存,共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。进程可以将同一段物理内存...

    共享内存通讯,共享内存通讯源码,C,C++

    标题提到的"共享内存通讯,共享内存通讯源码,C,C++",表明我们将探讨的是如何使用C和C++编程语言实现基于共享内存的进程间通信。 首先,让我们理解什么是共享内存。共享内存是进程间通信(IPC,Inter-Process ...

    基于stl共享内存,可以像使用STL容器一样使用共享内存

    在标题和描述中提到的"基于stl共享内存,可以像使用STL容器一样使用共享内存",指的是通过设计一个自定义的内存分配器(Allocator),使得STL容器如vector、list、map等能够在共享内存上进行操作。这种方式的优势...

    VB程序间共享内存

    在VB中实现共享内存,我们需要借助Windows API(应用程序接口)来完成,因为VB原生并不直接支持共享内存。API函数`CreateFileMapping`和`MapViewOfFile`是创建和映射共享内存的关键。`CreateFileMapping`函数用于...

    共享内存的进程间通信

    共享内存是一种高效的进程间通信(IPC)机制,它允许不同的进程访问同一块内存空间,从而实现数据的快速交换。在Windows环境下,如VC6.0这样的开发工具可以用来编写和测试这种通信方式的代码。 首先,我们要理解...

    C#进程间通信之共享内存

    本文将重点探讨在C#环境中如何利用共享内存进行进程间通信,这对于理解和优化多进程应用的性能至关重要。 共享内存是一种高效的IPC机制,它允许多个进程直接读写同一块内存区域,而无需通过任何中间媒介。在C#中,...

    Winodws平台C++共享内存实现(万恶的CSDN)

    在Windows平台上,C++共享内存是一种高效的进程间通信(IPC, Inter-Process Communication)方法,允许不同的进程访问同一块内存区域。本项目提供了一个已经封装为C++类的实现,使得服务端可以写入数据,而客户端则...

    c#共享内存实例源码 CSharp ShareMemory

    C#共享内存的实例,附源码和工程文件。 网上有C#的共享内存类,不过功能太简单了。 故,对此进行了改进。通过利用共享内存的一部分空间来存储当前内存中存储的数据信息(count和length),完成了对内存读写功能的...

    C++共享内存进程间通信 demo

    在Windows系统中,File Mapping(文件映射)是实现共享内存的一种方式,它允许多个进程访问同一块物理内存,极大地提高了效率。本篇将深入讲解C++中使用File Mapping进行进程间通信的示例。 共享内存是IPC方法之一...

    c#共享内存demo-两个进程间通过共享内存实现通信

    ShareMemLib将共享内存代码封装成lib,定义了发送者和监听者 两个进程在实例化ShareMemory时指定相同的map,并指定当前为发送者或监听者 发送者负责发送消息,监听者负责接受消息(监听者务必实现接受消息处理方法) ...

    C#进程间通信-共享内存代码实例

    在C#中,实现进程间通信有多种方法,如管道、套接字、消息队列等,而共享内存是其中一种高效且直接的方式。本篇文章将深入探讨C#中的共享内存实现,并通过一个具体的代码实例来阐述其工作原理。 共享内存是一种让多...

    C#实现共享内存通讯交互

    在IT领域,共享内存是一种高效的进程间通信(IPC)机制,允许不同的进程访问同一块内存空间,从而实现数据的快速交换。在这个"C#实现共享内存通讯交互"的项目中,我们将探讨如何使用C#语言来实现在WinForms应用程序...

    linux 共享内存浅析

    ### Linux共享内存浅析 #### 共享内存概述 共享内存是进程间通信(IPC)的一种方式,通过在内核中开辟一块特定的内存区域,允许多个进程对其进行访问,以此实现数据的共享和传递。相比其他进程间通信机制,共享...

    使用共享内存及信号量实现进程间通信例子

    在Linux中,可以使用`shmget`函数创建共享内存,`shmat`函数将共享内存附加到进程的地址空间,而`shmdt`用于解除对共享内存的附加。此外,`shmctl`用于管理共享内存段,例如删除或调整大小。 **信号量** 是一个整型...

    在Kubernetes中,Pod间实现共享内存的解决方案.docx

    在 Kubernetes 中,Pod 间实现共享内存的解决方案 在 Kubernetes 中,Pod 间实现共享内存是实现高性能和低耦合性的重要解决方案。文章中,我们将讨论为什么要将公共基础组件 Agent 进行 DaemonSet 部署,Linux 共享...

    C 共享内存读写 2个程序之间传输数据

    在IT领域,尤其是在多进程编程中,C语言的共享内存是一种高效的数据通信方式,它允许两个或多个进程之间共享同一块内存空间,从而实现数据的快速传输。在Linux操作系统环境下,这种技术通常依赖于POSIX标准提供的...

    共享内存镜像读写_共享内存_共享内存镜像读写_

    共享内存是一种高效的进程间通信(IPC)方式,它允许不同的进程直接访问同一块物理内存,无需通过传统的数据复制和传递。在本项目中,我们利用Visual Studio 2010开发环境来实现这一机制,这涉及到Windows API中的...

    利用共享内存实现进程通信

    本项目聚焦于“利用共享内存实现进程通信”,这是一种高效且直接的数据交换方式,尤其适用于需要快速同步和数据交换的进程之间。我们将深入探讨如何在VC++环境下,结合MFC(Microsoft Foundation Classes)库来实现...

    codesys与C#通过共享内存实现通信

    在本场景中,我们关注的是如何使用Codesys(一种基于IEC 61131-3标准的PLC编程软件)和C#(微软开发的面向对象的编程语言)通过共享内存实现通信。这种通信方式高效且直接,特别适用于需要快速数据交换的环境。 ...

    linux 共享内存详解

    ### Linux共享内存详解 #### 一、概述 在Linux及Unix环境下,进程间通信(IPC, Inter-Process Communication)是一项重要的技术,它允许不同进程之间交换数据和信息。System V IPC提供了三种通信机制:消息队列、...

Global site tag (gtag.js) - Google Analytics