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);
        }
        
        
    }
  • 相关阅读:
    HDU4731+找规律
    Unable to open c
    珠宝
    allegro添加多个过孔
    STM32硬件复位时间
    Android 系统的四层结构
    AIDL与stub
    devfs,proc,udev
    cdev[典]
    Linux设备管理之权限倾斜——mem、proc、devfs、sysfs、udev(下)
  • 原文地址:https://www.cnblogs.com/huacw/p/3581714.html
Copyright © 2011-2022 走看看