zoukankan      html  css  js  c++  java
  • C++进程间通信之共享内存

    转载:http://blog.csdn.net/taily_duan/article/details/51692999

    转载:http://blog.csdn.net/fengrx/article/details/4069088

    转载:http://www.cnblogs.com/xuandi/p/5673917.html

    // ServerCom.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    #include <stdio.h>
    #include <windows.h>
    #pragma endregion
    #define MAP_PREFIX          L"Local\"
    #define MAP_NAME            L"SampleMap"
    #define FULL_MAP_NAME       MAP_PREFIX MAP_NAME
    
    // Max size of the file mapping object.
    #define MAP_SIZE            65536
    
    // File offset where the view is to begin.
    #define VIEW_OFFSET         0
    
    // The number of bytes of a file mapping to map to the view. All bytes of the 
    // view must be within the maximum size of the file mapping object (MAP_SIZE). 
    // If VIEW_SIZE is 0, the mapping extends from the offset (VIEW_OFFSET) to  
    // the end of the file mapping.
    #define VIEW_SIZE           1024
    
    // Unicode string message to be written to the mapped view. Its size in byte 
    // must be less than the view size (VIEW_SIZE).
    #define MESSAGE             L"Message from the first process."
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        HANDLE hMapFile = NULL;
        PVOID pView = NULL;
    
        // Create the file mapping object.
        hMapFile = CreateFileMapping(
            INVALID_HANDLE_VALUE,   // Use paging file - shared memory
            NULL,                   // Default security attributes
            PAGE_READWRITE,         // Allow read and write access
            0,                      // High-order DWORD of file mapping max size
            MAP_SIZE,               // Low-order DWORD of file mapping max size
            FULL_MAP_NAME           // Name of the file mapping object
            );
        if (hMapFile == NULL) 
        {
            wprintf(L"CreateFileMapping failed w/err 0x%08lx
    ", GetLastError());
            goto Cleanup;
        }
        wprintf(L"The file mapping (%s) is created
    ", FULL_MAP_NAME);
    
        // Map a view of the file mapping into the address space of the current 
        // process.
        pView = MapViewOfFile(
            hMapFile,               // Handle of the map object
            FILE_MAP_ALL_ACCESS,    // Read and write access
            0,                      // High-order DWORD of the file offset 
            VIEW_OFFSET,            // Low-order DWORD of the file offset 
            VIEW_SIZE               // The number of bytes to map to view
            );
        if (pView == NULL)
        { 
            wprintf(L"MapViewOfFile failed w/err 0x%08lx
    ", GetLastError()); 
            goto Cleanup;
        }
        wprintf(L"The file view is mapped
    ");
    
        // Prepare a message to be written to the view.
        PWSTR pszMessage = MESSAGE;
        DWORD cbMessage = (wcslen(pszMessage) + 1) * sizeof(*pszMessage);
    
        // Write the message to the view.
        memcpy_s(pView, VIEW_SIZE, pszMessage, cbMessage);
    
        wprintf(L"This message is written to the view:
    "%s"
    ",
            pszMessage);
    
        // Wait to clean up resources and stop the process.
        wprintf(L"Press ENTER to clean up resources and quit");
        getchar();
    
    Cleanup:
    
        if (hMapFile)
        {
            if (pView)
            {
                // Unmap the file view.
                UnmapViewOfFile(pView);
                pView = NULL;
            }
            // Close the file mapping object.
            CloseHandle(hMapFile);
            hMapFile = NULL;
        }
    
        return 0;
    }
    // ClientCom.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <stdio.h>
    #include <windows.h>
    #pragma endregion
    #define MAP_PREFIX          L"Local\"
    #define MAP_NAME            L"SampleMap"
    #define FULL_MAP_NAME       MAP_PREFIX MAP_NAME
    
    // File offset where the view is to begin.
    #define VIEW_OFFSET         0
    
    // The number of bytes of a file mapping to map to the view. All bytes of the 
    // view must be within the maximum size of the file mapping object. If 
    // VIEW_SIZE is 0, the mapping extends from the offset (VIEW_OFFSET) to the 
    // end of the file mapping.
    #define VIEW_SIZE           1024
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        HANDLE hMapFile = NULL;
        PVOID pView = NULL;
    
        // Try to open the named file mapping identified by the map name.
        hMapFile = OpenFileMapping(
            FILE_MAP_READ,          // Read access
            FALSE,                  // Do not inherit the name
            FULL_MAP_NAME           // File mapping name 
            );
        if (hMapFile == NULL) 
        {
            wprintf(L"OpenFileMapping failed w/err 0x%08lx
    ", GetLastError());
            goto Cleanup;
        }
        wprintf(L"The file mapping (%s) is opened
    ", FULL_MAP_NAME);
    
        // Map a view of the file mapping into the address space of the current 
        // process.
        pView = MapViewOfFile(
            hMapFile,               // Handle of the map object
            FILE_MAP_READ,          // Read access
            0,                      // High-order DWORD of the file offset 
            VIEW_OFFSET,            // Low-order DWORD of the file offset
            VIEW_SIZE               // The number of bytes to map to view
            );
        if (pView == NULL)
        {
            wprintf(L"MapViewOfFile failed w/err 0x%08lx
    ", GetLastError()); 
            goto Cleanup;
        }
        wprintf(L"The file view is mapped
    ");
    
        // Read and display the content in view.
        wprintf(L"Read from the file mapping:
    "%s"
    ", (PWSTR)pView);
    
        // Wait to clean up resources and stop the process.
        wprintf(L"Press ENTER to clean up resources and quit");
        getchar();
    
    Cleanup:
    
        if (hMapFile)
        {
            if (pView)
            {
                // Unmap the file view.
                UnmapViewOfFile(pView);
                pView = NULL;
            }
            // Close the file mapping object.
            CloseHandle(hMapFile);
            hMapFile = NULL;
        }
    
        return 0;
    }

    注:运行的时候先运行写入的进程,再运行读出的进程

  • 相关阅读:
    ELK+FileBeat 开源日志分析系统搭建-Centos7.8
    ORACLE转换时间戳方法(1546272000)
    由Swap故障引起的ORA-01034: ORACLE not available ORA-27102: out of memory 问题
    数据库设计规范
    数据库字段备注信息声明语法 CDL (Comment Declaration Language)
    渐进式可扩展数据库模型(Progressive Extensible Database Model, pedm)
    使用 ES6 的 Promise 对象和 Html5 的 Dialog 元素,模拟 JS 的 alert, confirm, prompt 方法的阻断执行功能。
    在sed中引入shell变量的四种方法
    参考文献中的[EB/OL]表示什么含义?
    优秀看图软件 XnViewMP v0.97.1 / XnView v2.49.4 Classic
  • 原文地址:https://www.cnblogs.com/chechen/p/7606895.html
Copyright © 2011-2022 走看看