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

编程步骤:编程

1.建立共享内存,获得一个共享内存ID(该ID通常大于50000)spa

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

3.操做共享内存blog

4.卸载虚拟地址进程

5.删除共享内存ip

 

应用案例:内存

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

#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获得共享内存,而且访问内存数据。string

#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);
    }
    
    
}
相关文章
相关标签/搜索