linux共享内存通信方式,linux下进程通信方式--共享内存

本文详细介绍了共享内存作为进程间通信最快方式的特点,包括减少拷贝、无同步互斥机制等,并提供了C语言实现的示例代码,包括 shmget、shmat、shmdt 和 shmctl 函数的使用,以及创建、挂接、去挂接和删除共享内存的步骤。
摘要由CSDN通过智能技术生成

1、概念

不同进程看到共同区域

0818b9ca8b590ca3270a3433284dd417.png

2、特点

(1)是进程间通信最快的方式,对不同内存的映射(少了两次拷贝)

(2)不提供任何同步互斥机制,也不自己维护

(3)接口简单

3、通信方式

由文件系统提供--管道

由system V提供--消息队列、信号量、共享内存

共享内存与信号量搭配使用

4、实现shmat、shmdt

at:挂接   dt:去挂接

0

1

2

1

0

创建

挂接

被另一进程看到

退出

再退出

代码实现:

shm.h文件:

#ifndef __SHM__

#define __SHM__

#include

#include

#include

#include

#include

#define __PATH__ "."

#define __PROJECT__ 8888

#define __SHM_SIZE__ 4096

int get_shm();

char* at_shm();

int delete_shm();

int rm_shm();

#endif

shm.c文件:

#include"shm.h"

int get_shm()

{

key_t key=ftok(__PATH__,__PROJECT__);

int flag=IPC_CREAT|0666;

int shm_id=shmget(key,__SHM_SIZE__,flag);

if(shm_id==-1){

printf("get share memory error!\n");

}else{

printf("get share memory success!\n");

}

return shm_id;

}

char *at_shm(int shm_id)

{

return(char*)shmat(shm_id,NULL,0);

}

int delete_shm(char *addr)

{

return shmdt(addr);

}

//if success,return(),else return -1

int rm_shm(int shm_id)

{

return shmctl(shm_id,IPC_RMID,NULL);

}

test_shm.c文件:

#include"shm.h"

int main()

{

int shm_id=get_shm();

pid_t id=fork();

if(id<0){

printf("fork error\n");

return 1;

}else if(id==0){//child

char *buf=at_shm(shm_id);

int i=0;

while(i<4096){

buf[i]='X';

i++;

}

buf[4096]='\0';

delete_shm(buf);

}else{     //father

char *buf=at_shm(shm_id);

sleep(5);

printf("%S\n",buf);

delete_shm(buf);

waitpid(id,NULL,0);

rm_shm(shm_id);

}

return 0;

}

Makefile文件:

test_shm:shm.c test_shm.c

gcc -o $@ $^

.PHONY:clean

clean

rm -f test_shm

运行结果:

[zr@localhost shm]$ make

gcc -o test_shm shm.c test_shm.c

[zr@localhost shm]$ ./test_shm

get share memory success!

[zr@localhost shm]$

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值