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

编程步骤:

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\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++;
    }
    
}

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

 

 

posted @ 2014-03-05 09:03  走路到纽约  阅读(1094)  评论(0编辑  收藏  举报