• 多个进程共享内存


    • HANDLE hmapfile = OpenFileMapppingA(FILE_MAP_READ, FALSE, "shijiaxing");    //打开共享内存,可以用于进程通信,也可以用于线程通行。第一个参数是首地址第二个参数表示是否将其锁定为当前的进程内,FALSE表示不锁定。第三个是命名。
    • 在操作系统中,一个进程是不能读写另一个进程的内存的,他们的进程内存必须是互相独立的,C语言把所有的设备都当作文件来处理,在内存里开辟了一段数据,开辟了一段缓冲区,把他模拟成设备,两个进程就能同时访问。如果多个cgi需要通信,就需要访问这个设备,
    • 在内存里开辟了一段缓冲区,然后将这个缓冲区模拟成一个设备,那么另外两个进程就可以同时访问它。一个写一个读。如果多个cgi需要通行就需要访问这个”设备“,共享内存主要用在, 同时有很多个进程要同时访问。

      CreateFileMappingA(INVALID_HANDLE_VALE, NULL, PAGE_READWRITE|SEC_COMMIT, 0, SIZE, "mingzi")
      CreateFileMappingA相当于创建了一个文件映射,同时会分配一段内存给我们。开辟完成之后就相当于创建了一个设备。
      CreateFileMapping不仅仅是操作文件,还可以操作设备,我们可以在内存理开辟一段内存,模拟一个设备。

      管理多个进程,用的最多的就是cgi。

    1.服务端

    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    
    #define  SIZE 4096
    LPVOID lpdata = NULL;//指针标识首地址
    
    void main()
    {
        if (lpdata!=NULL)
        {
            puts("共享内存存在");
        }
        HANDLE hmap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL,
            PAGE_READWRITE | SEC_COMMIT, 0, SIZE, "yinchengmem");
    
        if (hmap==NULL)
        {
            puts("创建失败");
        }
        else
        {
            //映射文件到指针
            lpdata = MapViewOfFile(hmap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);   //映射文件,创建指针,指向这片内存。
    
    
            ///char  str[100] = "hello world ,hello china";
        ///    memcpy(lpdata, str, strlen(str) + 1);//拷贝内存
            int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
            memcpy(lpdata, a, 40);
    
        }
    
        system("pause");
    
    
        UnmapViewOfFile(lpdata);//解除,释放该函数的输入参数为调用MapViewOfFile()时所返回的指向文件映像在进程的地址空间中
      //的起始地址的指针在调用MapViewOfFile()后,必须确保在进程退出之前能够执行UnmapViewOfFile()函数,否则在进程终止之后先前保
      //留的区域将得不到释放,即使再次启动进程重复调用 MapViewOfFile()系统也总是在进程的地址空间中保留一个新的区域,而此前保留的所
      //有区域将得不到释放。
    CloseHandle(hmap); system("pause"); }

    2.客户端

    #include<stdio.h>
    #include<stdlib.h>
    #include<Windows.h>
    
    void main()
    {
        HANDLE hmapfile = OpenFileMappingA(FILE_MAP_READ, FALSE, "yinchengmem");
        if (hmapfile == NULL)
        {
            printf("开辟失败");
        }
        //创建指针,指向这片内存
        LPVOID lpbase = MapViewOfFile(hmapfile, FILE_MAP_READ, 0, 0, 0);  //将刚刚创建的内存映射到定义指针hmapfile

    if (lpbase == NULL) { printf("open失败"); } //printf("%s", (char*)lpbase); int*p = lpbase; for (int i = 0; i < 10;i++) { printf("%d ", p[i]); } UnmapViewOfFile(lpbase);//解除 CloseHandle(hmapfile); system("pause"); }
  • 相关阅读:
    纯CSS实现的很酷的卡通肖像和眨眼动效
    RMQ(区间求最值)
    CentOS---网络配置具体解释
    breakpoints &amp;&amp; lldb &#160;&amp;&amp; chisel 的使用
    c语言单链表实现
    hdu1595 find the longest of the shortest(Dijkstra)
    POJ 3254 Corn Fields 状态压缩
    我多希望我学编程时,有人教我这些事!
    tts和字符集的关系--要求源和目的端的数据库字符集必须一样,国家字符集必须一样。
    [读后感]编程能力与编程年龄
  • 原文地址:https://www.cnblogs.com/sjxbg/p/5915010.html
Copyright © 2020-2023  润新知