• 基于内存的通信之一 “内核共享内存”


    编程步骤:

    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);
        }
        
        
    }
  • 相关阅读:
    在linux中安装JAVA的环境和安卓的环境(1)
    如何安装Tomcat
    Android开发历程_2(实现简单的乘法计算)
    Android开发历程_1(从1个activity跳转到另一个activity)
    Java 征途:行者的地图
    android系统架构之虚拟机
    Android四大组件及生命周期
    GridView属性大全
    安卓中各种用到的监听器
    移动端控制台排查方法
  • 原文地址:https://www.cnblogs.com/huacw/p/3581714.html
Copyright © 2020-2023  润新知