首页 > 其他 > 详细

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

时间:2014-03-05 18:25:13      阅读:418      评论:0      收藏:0      [点我收藏+]

编程步骤:

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

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

3.操作共享内存

4.卸载虚拟地址

5.删除共享内存

 

应用案例:

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

bubuko.com,布布扣
#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\n"),exit(-1);
    
    shmid=shmget(key,4,IPC_CREAT|IPC_EXCL|0666);
    if(shmid==-1) printf("get error:%m\n"),exit(-1);
    //2.挂载共享内存shmat
    p=shmat(shmid,0,0);
    if(p==(int*)-1) printf("at error:%m\n"),exit(-1);
    //3.访问共享内存
    while(1)
    {
        *p=i;
        sleep(1);
        i++;
    }
    
}
bubuko.com,布布扣

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

bubuko.com,布布扣
#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\n"),exit(-1);
    
    shmid=shmget(key,4,0);
    if(shmid==-1) printf("get error:%m\n"),exit(-1);
    //2.挂载共享内存shmat
    p=shmat(shmid,0,0);
    if(p==(int*)-1) printf("at error:%m\n"),exit(-1);
    //3.访问共享内存
    while(1)
    {        
        sleep(1);
        printf("%d\n",*p);
    }
    
    
}
bubuko.com,布布扣

基于内存的通信之一 “内核共享内存”,布布扣,bubuko.com

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

原文:http://www.cnblogs.com/huacw/p/3581714.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!