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");
}

你可能感兴趣的:(linux)