内存映射文件mapping file:windows的C, C#实现

内存映射文件mapping file:windows的C, C#实现

C 发送端代码,先用CreateFileMapping()创建共享内存,pBuf是内存中的内容,将内容写入其中。

#include <cstdio>
#include <windows.h>
using namespace std;
 
#define BUF_SIZE 1025
const char szName[] = "fileMapping_01";    // 共享内存的名字
 
int main()
{
    char msg[BUF_SIZE];
    // 创建共享文件句柄
    HANDLE hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // 物理文件句柄
        NULL,                    // 默认安全级别
        PAGE_READWRITE,          // 可读可写
        0,                       // 高位文件大小
        BUF_SIZE,                // 地位文件大小
        (LPCSTR)szName                   // 共享内存名称
        );
 
 
    char *pBuf = (char *)MapViewOfFile(
        hMapFile,            // 共享内存的句柄
        FILE_MAP_ALL_ACCESS, // 可读写许可
        0,
        0,
        BUF_SIZE
        );
 
 
    while(1)
    {

        printf("Input:");
        scanf("%s",msg);
        strncpy(pBuf, msg, BUF_SIZE - 1);
        pBuf[BUF_SIZE - 1] = '\0';
    }
 
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    return 0;
}

C 接收端,从中读数据输出到控制台

#include <cstdio>
#include <windows.h>
using namespace std;
 
#define BUF_SIZE 1025
const char szName[] = "fileMapping_01";    // 共享内存的名字
 
int main()
{
    // 创建共享文件句柄
    HANDLE hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // 物理文件句柄
        NULL,                    // 默认安全级别
        PAGE_READWRITE,          // 可读可写
        0,                       // 高位文件大小
        BUF_SIZE,                // 地位文件大小
        (LPCSTR)szName                   // 共享内存名称
        );
 
 
    char *pBuf = (char *)MapViewOfFile(
        hMapFile,            // 共享内存的句柄
        FILE_MAP_ALL_ACCESS, // 可读写许可
        0,
        0,
        BUF_SIZE
        );
 
    while(1)
    {
        printf("%s",pBuf);
        for(int k=0;k<100;k++)
        {
            printf("\b");
        }
    }
 
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);
    return 0;
}

C#类似,但C#的char是2字节的,若要与C进行字符上的通信,必须用byte进行数据流的交换,再对byte进行转换才可以。

using System;
using System.IO;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using System.Threading;
namespace sendfm
{
    
    class Program
    {
        public struct ServiceMsg
        {
            public int Id;
            public long NowTime;
        }
        static void Main(string[] args)
        {
            String shareName = "sharedMem";
            using (MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(shareName, 1024000, MemoryMappedFileAccess.ReadWrite))
            {
                bool mutexCreated;
                //进程间同步
                var mutex = new Mutex(true, "testmapmutex", out mutexCreated);
                using (MemoryMappedViewStream stream = mmf.CreateViewStream()) //创建文件内存视图流
                {
                    var writer = new BinaryWriter(stream);
                    for (int i = 0; i < 5; i++)
                    {
                        writer.Write(10*i);
                        Console.WriteLine("{0}位置写入流:{0}", i);
                    }
                }

                mutex.ReleaseMutex();

                Console.WriteLine("启动状态服务,按【回车】读取共享内存数据");
                Console.ReadLine();

                mutex.WaitOne();
                using (MemoryMappedViewStream stream = mmf.CreateViewStream())
                {
                    var reader = new BinaryReader(stream);
                    for (int i = 0; i < 10; i++)
                    {
                        Console.WriteLine("{1}位置:{0}", reader.ReadInt32(), i);
                    }
                }

                using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor(1024, 10240))
                {
                    int colorSize = Marshal.SizeOf(typeof(ServiceMsg));
                    ServiceMsg color;
                    for (int i = 0; i < 50; i += colorSize)
                    {
                        accessor.Read(i, out color);
                        Console.WriteLine("{1}\tNowTime:{0}", new DateTime(color.NowTime), color.Id);
                    }
                }
                mutex.ReleaseMutex();
            }
        }
    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注