系统编程之进程间的共享内存通信(3)

系列文章目录

第一章 系统编程之多进程

第二章 系统编程之进程间的 管道 通信(1)

第二章 系统编程之进程间的 信号 通信(2)

第二章 系统编程之进程间的 共享内存 通信(3)

第二章 系统编程之进程间的 信号量 通信(4)

第二章 系统编程之进程间的 消息队列 通信(5) 

目录

系列文章目录

一、共享内存

1 相关的接口函数

1.1 申请共享内存

1.2 映射得到共享内存的首地址 

1.3 解除映射 

1.4 多功能函数,删除共享内存,设置,获取共享内存的属性信息 

2 代码示例 

总结 


一、共享内存

        共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

ipcs  -m                                  //  查看共享内存

ipcrm  -m  共享内存的ID号    // 删除共享内存

1 相关的接口函数

1.1 申请共享内存

#include <sys/ipc.h>                  

#include <sys/shm.h>                    

int shmget(key_t key, size_t size, int shmflg);

返回值:成功返回申请得到的共享内存的ID号                                                    

               失败 -1                              

参数1:key(重点)  表示键值,用来保证多个进程申请的内存区域是一致的

             linux中有两种产生键值的方法:

             (1) 程序员自己指定一个正整数作为键值                                                                

             (2) 调用ftok()生成键值

                //根据你传递的路径和整数ftok函数内部有一套算法,计算得到唯一的键值

              key_t  ftok(const char *pathname, int proj_id);

              返回值:成功 返回一个键值
                            失败  -1
              参数:pathname --》合法有效的linux路径
                         proj_id --》随便写个整数

 参数2:size:你要申请多大的内存区域,单位是字节  一般按照512字节的整数倍去申请
 参数3:shmflg :PC_CREAT   //O_CREAT
                              IPC_EXCL     //O_EXCL   O_TRUNC
                              0777

1.2 映射得到共享内存的首地址 

void *shmat(int shmid, const void *shmaddr, int shmflg);
返回值:成功映射得到共享内存的首地址
              失败NULL
参数:shmid:共享内存的ID号
           shmaddr :一般设置为NULL,表示由系统给我自动分配得到共享内存的首地址
           shmflg :一般设置为0,表示可读可写

1.3 解除映射 

int shmdt(const void *shmaddr);
参数:shmaddr --》刚才映射得到的首地址

1.4 多功能函数,删除共享内存,设置,获取共享内存的属性信息 

int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:cmd :IPC_STAT  //我想获取共享内存属性信息
                       IPC_SET    //我想设置共享内存的属性信息(只能设置权限,大小无法修改)
                       IPC_RMID //我想删除共享内存
           buf :结构体,用来保存共享内存的属性信息
                   struct shmid_ds {
                                struct ipc_perm shm_perm;    //权限 
                                size_t          shm_segsz;          //大小
                                time_t          shm_atime;   /* Last attach time */
                                time_t          shm_dtime;   /* Last detach time */
                                time_t          shm_ctime;   /* Last change time */
                                pid_t           shm_cpid;    //进程的ID号
                                pid_t           shm_lpid;     //最后一个映射的进程的ID
                                shmatt_t        shm_nattch;   //连接数
                   };
                  struct ipc_perm {
                          key_t          __key;    //键值
                          unsigned short mode;  //权限
                  };

2 代码示例 

int main()
{
	int shmid;

	//申请共享内存
	shmid=shmget(54544,1024,IPC_CREAT|IPC_EXCL|0777); //新建共享内存
	if(shmid==-1)
	{
		//进一步分析错误原因
		if(errno==EEXIST) //共享内存已经存在
		{
			shmid=shmget(54544,1024,0777); //打开共享内存
		}
		else //其他错误
		{
			perror("申请失败!\n");
			return -1;
		}
	}

	//映射得到首地址
	char *p=shmat(shmid,NULL,0);
	if(p==NULL)
	{
		perror("映射失败!\n");
		return -1;
	}
	
	//访问另外一个进程存放到共享内存中的信息
	printf("共享内存中其它进程发送过来的信息是:%s\n",p);
	
	//定义结构体变量,用于存放获取到的属性信息
	struct shmid_ds myds;
	//获取你刚才申请成功的那个共享内存的属性信息
	shmctl(shmid,IPC_STAT,&myds);
	printf("大小是:%ld\n",myds.shm_segsz);
	printf("键值是:%x\n",myds.shm_perm.__key);
	printf("权限是:%o\n",myds.shm_perm.mode);
	
}

总结 

本文主要讲解了共享内存的原理和使用实例。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值