zoukankan      html  css  js  c++  java
  • Linux进程间通信(4):共享内存

    接上一篇的内容——Linux进程间通信(3):信号量

    参考书籍:《从实践中学嵌入式linux应用程序开发》(华清远见嵌入式学院)

    UNIX网络编程 卷2 进程间通信(第2版)(中文版)

    资料下载:http://download.csdn.net/detail/klcf0220/5332973

    参考链接:mmap()及其相关系统调用:http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html

    系统V共享内存: http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index2.html

    简介:共享内存可以说是最为高效的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

    共享内存:

    实现步骤:
    1、创建共享内存,用到的函数是shmget(),也就是从内存中获得一段共享内存区域;
    2、映射共享内存,用到的函数时shmat(),也就是把这段创建的共享内存映射到具体的进程空间中。
    3、除此之外,还有撤销映射的操作,其函数为shmdt()。
    参考实例:

    /***** SHM_write.c *******/
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include<string.h>
    typedef struct{
        char name[4];
        int age;
    } people;
    main(int argc, char** argv)
    {
        int shm_id,i;
        key_t key;
        char temp;
        people *p;
        char* NAME = "/tmp";
        key = ftok(NAME,0);
        if(key==-1)
            perror("ftok error");
        shm_id=shmget(key,4096,IPC_CREAT);    
        if(shm_id==-1)
        {
            perror("shmget error");
            return;
        }
        p=(people*)shmat(shm_id,NULL,0);
        temp='a';
        for(i = 0;i<10;i++)
        {
            temp+=1;
            memcpy((*(p+i)).name,&temp,1);
            (*(p+i)).age=20+i;
        }
        if(shmdt(p)==-1)
            perror(" detach error ");
    }
    
    /********** SHM_read.c ************/
    #include<sys/ipc.h>
    #include<sys/shm.h>
    #include<stdio.h>
    #include<sys/types.h>
    #include<unistd.h>
    #include<string.h>
    typedefstruct{
       char name[4];
       int age;
    } people;
    main(int argc, char** argv)
    {
       int shm_id,i;
        key_t key;
        people*p;
       char* NAME = "/tmp";
        key= ftok(NAME,0);
       if(key == -1)
            perror("ftok error");
        shm_id= shmget(key,4096,IPC_CREAT);    
       if(shm_id == -1)
        {
            perror("shmget error");
           return;
        }
        p= (people*)shmat(shm_id,NULL,0);
       for(i = 0;i<10;i++)
        {
        printf("name:%s\t",(*(p+i)).name );
        printf("age %d\n",(*(p+i)).age );
        }
       if(shmdt(p) == -1)
            perror(" detach error");
    }
    作者:快乐出发0220 ;Android群:151319601 ; Linux群:96394158 ;转载请注明出处 http://klcf0220.cnblogs.com/ !!!
  • 相关阅读:
    简单介绍数据流动的控制
    数据再寄存器中的暂时保存
    八位三态数据通路控制器的逻辑电路设计讲解
    什么是同步有限状态机???
    verilog逻辑复制
    流水线经典讲解!!!!!
    流水线(pipe-line)简介
    总线(BUS)和总线操作
    多路选择器(multiplexer)简介
    使用telnet发送HTTP请求
  • 原文地址:https://www.cnblogs.com/klcf0220/p/3060781.html
Copyright © 2011-2022 走看看