Linux下多任务间通信和同步-System V共享内存

Linux下多任务间通信和同步-System V共享内存

嵌入式开发交流群280352802,欢迎加入!

1.简介

共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝.为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间.进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率.由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等.

2.共享内存实现的步骤

  • 创建共享内存,这里用到的函数是shmget,也就是从内存中获得一段共享内存区域;
  • 映射共享内存,也就是把这段创建的共享内存映射到具体的进程空间中去,这里使用的函数是shmat;
  • 到这里,就可以使用这段共享内存了,也就是可以使用不带缓冲的I/O读写命令对其进行操作;
  • 撤销映射的操作,其函数为shmdt.
调用shmgat的过程相当于映射文件系统shm中的同名文件过程,原理和mmap大同小异,但使用更加方便.

3.shmget系统调用

该系统调用获得(或新建)一个共享内存区域,调用成功返回该区域的ID,即shmid,若出错则返回-1. shmget函数语法:

注意:共享内存,消息队列和信号量是由内核维护的进程间通信方式,它们一IPC结构的结构存在于内核中,在内部以标示符加以应用,而在外部则通过键值引用.键的数据结构为key_t类型,由内核负责将它转换为标示符.命令ipcs可以提供系统中所有的共享内存,消息队列和信号量的标示符和键.

4.shmat系统调用

该系统调用将shmget返回的区域映射到进程的内存空间中.shmat函数语法:


5.shmdt系统调用

该系统调用解除被共享内存区域与进程地址addr的映射关系.shmdt函数语法:


6.System V共享内存的应用实例

下面我们看一个例子.

/**************************************************************************************/
/*简介:System V共享内存						 */
/*************************************************************************************/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
	char name[4];
	int age;
} people;

int main(int argc, char** argv)
{
	int shm_id,i;
	people *p_map;
	char name[4];
	shm_id=shmget(IPC_PRIVATE,2048,0600);	
	if(shm_id<0)
	{
		perror("shmget error");
		return 1;
	}
	/*写操作*/

	p_map=(people*)shmat(shm_id,0,0);
	if (p_map<0)
	{
		perror("shmmat error");
		return 1;
	}

	name[0]='a';
	name[1]='\0';
	for(i = 0;i<10;i++)
	{
		name[0]++;
		memcpy((*(p_map+i)).name,&name,sizeof(name));
		(*(p_map+i)).age=20+i;
	}
	if(shmdt(p_map)<0)
		perror(" detach error ");
	/*读操作*/
	p_map = (people*)shmat(shm_id,NULL,0);
	for(i = 0;i<10;i++)
	{
		printf( "name:%s\n",(*(p_map+i)).name );
		printf( "age %d\n",(*(p_map+i)).age );
	}

	if(shmdt(p_map)<0)
		perror(" detach error ");

	return 0;
}
运行结果如下:



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值