[Linux] 进程间通信之System V 共享内存

1)System V IPC的相关概念

  • System V IPC是OS特地设计的通信方式,为了让不同的进程能够看到同一份资源;
  • 消息队列、共享内存:以传送数据为目的;
  • 信号量:保证进程的同步与互斥,属于通信范畴。

2)System V 共享内存的相关概念

  • 共享内存区(在物理内存中)是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,进程之间的数据传递不再涉及到内核;
  • 共享内存的生命周期随内核,必须手动删除,否则不会自动清除,除非重启;
  • key值是在内核层面上,多个进程之间,区分共享内存的唯一方式;
  • shmid是在进程内部,区分IPC资源;
  • 查看共享内存信息:ipcs -m
  • 删除某一共享内存: ipcrm rm shmid号

3)System V 共享内存的相关操作

  1. 生成key值(唯一标识一块共享内存)----ftok( )
  2. 创建共享内存----shmget( )
  3. 关联共享内存----shmat( )
  4. 取消关联共享内存----shmdt( )
  5. 删除共享内存块----shmdtl( )

4) 使用System V 共享内存实现Server&Client通信

  1. Server端读取共享内存中的数据
int main(){
key_t key = ftok(PATHNAME, PROJ_ID);  //key保证通信的两端使用的是同一块共享内存
printf("key: %p\n", key);

int shmid = shmget(key, SIZE, IPC_CREAT | IPC_EXCL |0666);  //创建共享内存
if(shmid < 0){
	printf("shmget error...\n");
	exit(1);
}
printf("shmid: %d\n", shmid);

char* str = (char*)shmat(shmid, NULL, 0);   //关联共享内存
while(1){
	sleep(1);
	printf("%s\n", str);
}

shmdt(str);  //取消关联
shmctl(shmid, IPC_RMID, NULL);  //删除共享内存
return 0;
}
  1. Client端向共享内存中传送数据
int main(){
key_t key = ftok(PATHNAME, PROJ_ID);
printf("key: %p\n", key);
int shmid = shmget(key, SIZE, 0);  //创建共享内存
if(shmid < 0){
	printf("shmget erroe...\n");
	exit(1);
}
printf("shmid: %d\n", shmid);

char* str = (char*)shmat(shmid, NULL, 0);   //关联共享内存
char c = 'a';
for(; c<='z'; c++){
	str[c-'a'] = c;  //每隔5秒钟,往共享内存里写入一个字符
	sleep(5);
}

shmdt(str);  //取消关联
shmctl(shmid, IPC_RMID, NULL);  //删除共享内存
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值