共享内存:

 用于进程之间的数据传递,是system v版本中最高效的,但是它不会同步与互斥,所以常与信号量搭配使用。

nattch:表示有多少个进程挂接在共享内存上。要查看其值用 ipcs -m 命令

wKioL1cTJATCl3OTAAAkrhdXGBc987.png

删除key值用 ipcrm -m +key值;

图形理解共享内存:

wKiom1cTMDOjC8YqAAAxNKhZNZk793.png


#include <sys/types.h>

#include <sys/shm.h>

1.创建共享内存函数:

int shget(key_t key,size_t size, int shmflg* buf);

    第二个参数是其大小,一般为4k 即4096的整数倍;

     第三个参数一般为:IPC_CREAT|IPC_EXCL;

2.销毁共享内存的函数:

int shmctl(int shm _id,int cmd,int shmflg* buf);

 第二个参数一般为:IPC_RMID;

3.挂接在共享内存上:

void *shmat(int shmid, const void *shmaddr, int shmflg);

4.去关联共享内存

int shmdt(const void *shmaddr);

共享内存实现代码:

//comm.h

  1 #include<stdio.h>
  2 #include<sys/ipc.h>
  3 #include<sys/shm.h>
  4 #include<stdlib.h>
  5 #include<unistd.h>
  6 #define  _PATH_ "."
  7 #define  _PROJ_ID_ 0X7777
  8 #define  _SIZE_  4096
  9 int shm_create()
 10 {
 11    key_t key=ftok(_PATH_, _PROJ_ID_);
 12     if(key<0)
 13       {
 14          perror("ftok");
 15          return -1;
 16       }
 17     int shm_id=shmget(key,_SIZE_,IPC_CREAT|IPC_EXCL|0666);
 18      if(shm_id<0)
 19      {
 20       perror("shmget");
 21       return -1;
 22       }
 23     return shm_id;
 24 }
 25 
 26 int shm_get()
 27 {
 28 
 29 
 30    key_t key=ftok(_PATH_, _PROJ_ID_);
 31     if(key<0)
 32       {
 33          perror("ftok");
 34          return -1;
 35       }
 36     int shm_id=shmget(key,_SIZE_,IPC_CREAT);//得到的是已创建好的
 37      if(shm_id<0)
 38      {
 39       perror("shmget");
 40       return -1;
 41       }
 42     return shm_id;
 43 
 44 }
 
 //server.c
 
  1 #include"comm.h"
  2 
  3 int main()
  4 {
  5   int shm_id=shm_create();
  6   sleep(10);
  7  char *start=at_shm(shm_id);
  8  int i;
  9  for(i=0;i<20;++i)
 10   {
 11 
 12     printf("%s\n",start);
 13     sleep(1);
 14 
 15    }
 16  dt_shm(start);
 17  shm_destroy(shm_id);
 18  return 0;
 19 }

//client.c

  1 #include"comm.h"
  2 
  3 int main()
  4 {
  5   int shm_id=shm_get();
  6   sleep(5);
  7   char *start=at_shm(shm_id);
  8   int i;
  9   for(i=0;i<20;++i)
 10   {
 11    start[i]='A';
 12    start[i+1]='\0';
 13    }
 14  sleep(7);
 15  dt_shm(start);
 16  sleep(12);
 17  return 0;
 18 
 19 
 20 
 21 
 22 }

 //Makefile
   1 .PHONY:all
  2 all:server client
  3 server:server.c
  4         gcc -o $@ $^
  5 client:client.c
  6         gcc -o $@ $^
  7 .PHONY:clean
  8 clean:
  9         rm -f server client

wKioL1cTKj-jcXmSAAB0rY9DX6U721.png

结果分析:
当server.c 运行起来时显示器上没有东西,当client.c运行起来打印东西时,这时的server也可以读到内容将其显示在显示器上。这样实现了不同进程之间的通信,通过共享内存。