1、概念

   不同进程看到共同区域


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

 2、特点

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

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

   (3)接口简单

3、通信方式

   由文件系统提供--管道

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

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

4、实现shmat、shmdt

     at:挂接   dt:去挂接

0
1
2
1
0
创建
挂接
被另一进程看到
退出
再退出

代码实现:

shm.h文件:

#ifndef __SHM__
#define __SHM__

#include<stdio.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<sys/wait.h>
#include<unistd.h>

#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]$