共享内存(初步了解)

共享内存

共享内存:是一种高效的进程通信方式,进程可以直接读写内存,而不需要任何数据拷贝(有名管道)

上面这个图,可以分两步看:

第一步:创建共享内存

第二步:建立共享内存的映射关系

下面我是实例来说明(由于水平有限,说错了见谅):

创建共享内存:用到int shmget(key_t key,int size,int shmflg);这个api,其具体信息可以查看man手册:第一个参数:主要是用于多个进程间同步机制来用的,看到代码你就会明白的,第二个参数,是你要开辟大小,第三个参数是权限(可以用于创建,详见查看man

  1 #include<stdio.h>

  2 #include<sys/ipc.h>

  3 #include<sys/shm.h>

  4 #include<stdlib.h>

  5 

  6 #define MAX_SIZE 4096

  7 

  8 int main(int argc,char *argv[]) {

  9         key_t key=100;

 10         if(shmget(key,MAX_SIZE,0666 | IPC_CREAT) < 0 ) { //key值最好自己指定,为了方便多个进程间的通信

 11                 perror("creat share memory error\n");

 12                 exit(-1);

 13         }

 14 

 15         printf("creat successful\n");

 16         exit(1);

 17 }

 18 

创建成功后可以用ipcs -m来查看创建成功的共享内存:注意这里创建的共享内存(如果在程序中没有建立映射关系),即不能被用户程序用,也不能被内核用,因而,在创建后如果不用,要删除:-pcrm -m 共享内存标识符

对于多个进程间的通信:

用到的api有:

int shmget(key_t key,int size,int shmflg) //f返回值是共享内存的段标识符

Void * shmat(int shmid,const void *shmaddr,int shmflg); //用于获得这个实际内存在该程序中的虚拟地址(这里是一个表的关系)

Int shmdt(const void *shmaddr); //在用完了该共享内存后,删除掉映射(表)。

下面是向共享内存中写入一个数据(简单写入)

  1 #include<stdio.h>

  2 #include<sys/stat.h>

  3 #include<sys/types.h>

  4 #include<stdlib.h>

  5 #include<fcntl.h>

  6 #include<sys/ipc.h>

  7 #define MAX_SIZE 4096

  8 int main(int argc,char *argv[]) {

  9         int shid;

 10         char *buf;

 11         if((shid = shmget(100,MAX_SIZE,0666 | IPC_CREAT)) < 0 ) {

 12                 perror("get shid error\n");

 13                 exit(-1);

 14         }

 15 

 16         buf=(char *)shmat(shid,NULL,0);

 17 

 18         buf[0] ='y';

 19         exit(0);

 20 

 21 }

下面是从共享内存中读出:

  1 #include<stdio.h>

  2 #include<stdlib.h>

  3 #include<sys/types.h>

  4 #include<sys/stat.h>

  5 #include<fcntl.h>

  6 #include<sys/ipc.h>

  7 #include<unistd.h>

  8 #define MAX_SIZE 4096

  9 int  main(int argc,char *argv[]) {

 10         int shid;

 11         char *buf;

 12         if((shid = shmget(100,MAX_SIZE,0666 | IPC_CREAT)) < 0) {

 13                 perror("get shid error\n");

 14                 exit(-1);

 15         }

 16 

 17         buf = (char *)shmat(shid,NULL,0);

 18 

 19         write(STDOUT_FILENO,buf,1);

 20         write(STDOUT_FILENO,"\n",1);

 21         exit(0);

 22 

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值