zoukankan      html  css  js  c++  java
  • 基于内存的通信之一 “内核共享内存”

    编程步骤:

    1.创建共享内存,得到一个共享内存ID(该ID一般大于50000)

    2.把ID映射到虚拟地址(也称为“挂载”)

    3.操作共享内存

    4.卸载虚拟地址

    5.删除共享内存

    应用案例:

    建立2个进程 A 和B 。其中A,创建共享内存,并且修改内存数据。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    key_t key;
    int shmid;
    int *p;
    int i=0;
    void deal(int s)
    {
        if(s==SIGINT)
        {
            //4.卸载共享内存shmdt
            shmdt(p);
            //5.删除共享内存shctl
            shmctl(shmid,IPC_RMID,0);
            exit(0);
        }
    }
    main()
    {
        
        signal(SIGINT,deal);
        //1.创建共享内存shmget
        key=ftok(".",255);
        if(key==-1) printf("ftok error:%m
    "),exit(-1);
        
        shmid=shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
        if(shmid==-1) printf("get error:%m
    "),exit(-1);
        //2.挂载共享内存shmat
        p=shmat(shmid,0,0);
        if(p==(int*)-1) printf("at error:%m
    "),exit(-1);
        //3.访问共享内存
        while(1)
        {
            *p=i;
            sleep(1);
            i++;
        }
        
    }

    B。根据ID得到共享内存,并且访问内存数据。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <signal.h>
    #include <sys/shm.h>
    #include <sys/ipc.h>
    key_t key;
    int shmid;
    int *p;
    void deal(int s)
    {
        if(s==2)
        {
            //4.卸载共享内存shmdt
            shmdt(p);
            exit(0);
        }
    }
    main()
    {
        signal(SIGINT,deal);    
        //1.创建共享内存shmget
        key=ftok(".",255);
        if(key==-1) printf("ftok error:%m
    "),exit(-1);
        
        shmid=shmget(key,4,0);
        if(shmid==-1) printf("get error:%m
    "),exit(-1);
        //2.挂载共享内存shmat
        p=shmat(shmid,0,0);
        if(p==(int*)-1) printf("at error:%m
    "),exit(-1);
        //3.访问共享内存
        while(1)
        {        
            sleep(1);
            printf("%d
    ",*p);
        }
        
        
    }
  • 相关阅读:
    @jackychua博客
    c#类与对象
    SQL SERVER 触发器
    .NET平台及C#面向对象编程
    数据库设计指南【转】
    HTTP 协议是一种请求/响应型的协议
    各种字符编码方式详解及由来(ANSI,GB2312,GBK,Big5,UNICODE,UTF8,UTF16)
    常用协议端口 POP3,IMAP,SMTP,Telnet,HTTP,HTTPS
    asp.net Request.Form Request.para Request.Querystring 区别
    Gzipstream 解压问题
  • 原文地址:https://www.cnblogs.com/huacw/p/3581714.html
Copyright © 2011-2022 走看看