进程通信 共享内存

1.共享内存

进程间通信的一种方式,多个进程共享一段内存,“共享内存”。

实现方式: 
	在内核中开辟一块空间,其它的进程通过 “映射”的方式
	获取这段共享内存的引用(指针)进程 P1 可以映射这段内存,同时其它进程 p2也可以映射
	这段内存, P1往这段内存中写数据,实际上就是往p2的进程
	地址空间写数据,反之亦然。
	类似于文件操作。

2.System V 共享内存 API函数

1.ftok 创建一个key
	 #include <sys/types.h>
     #include <sys/ipc.h>
     函数:
  	 	key_t ftok(const char *pathname, int proj_id);
			pathname : 一个文件系统中存在的路径名(要存在的)"/home/china/" ....
			proj_id : 整数, 一般用工程的代号。
	 返回值: 
		成功生成一个唯一的 System V ipc的key (key_t)
		失败返回-1,同时errno被设置。
2.创建或者打开System V 共享内存
       #include <sys/ipc.h>
   	   #include <sys/shm.h>
   	   函数:
   	    int shmget(key_t key, size_t size, int shmflg);
			key: System V IPC对象的key ,一般由ftok的返回值
			size : 以字节为单位指定共享内存的大小。当实际操作为创建一个新的共享内存区时,必须指定一个不为0的size的值(PAGE_SIZE 4k 的整数倍)。如果实际操作访问一个已经打开的共享内存,那么size应为0.		
		shmflg:标志位 
			(1) 创建 :IPC_CREAT | 权限位
			(2) 打开 0
		返回值: 
			成功返回共享内存区的id,这个id就唯一标识这个共享内存。
			失败返回-1,同时errno被设置。
3.映射 / 解映射
	shmat / shmdt
	 #include <sys/types.h>
     #include <sys/shm.h>
     shmat: 用来映射一段System V 共享内存的
 函数:
    	 void *shmat(int shmid, const void *shmaddr, int shmflg);
			shmid: 要映射的共享内存的id(shmget的返回值)
			shmaddr: 指向您要映射到进程的哪个地址中去一般为NULL,表示让系统自动分配地址。
		shmflg: 
			(1) SHM_RDONLY 只读
			(2) 0 读写	
		返回值 : 
			成功返回映射后的首地址
			失败返回NULL,同时errno被设置
	---------------------------------------------------------------------
		shmdt: 用来解映射一段System V 共享内存的
   int shmdt(const void *shmaddr);
		shmaddr:您要释放的空间地址(一般shmat的返回值)
		返回值: 
			成功返回0
			失败返回-1,同时errno被设置。
4.删除
	函数
		 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
			shmid: 要控制操作命令的共享内存的id 
			cmd : 操作命令,不同的命令第三个参数不一样
					IPC_RMID , 删除指定的共享内存
			buf: 如果cmd == IPC_RMID ,buf就为NULL 
		返回值: 
			成功返回0 
			失败返回-1,同时errno被设置。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值