共享内存是进程间通信方式中效率最高的,由内核创建,少了两次拷贝,直接操作共享内存。

优点:高效。

缺点:不提供同步与互斥。

 //comm.h
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<unistd.h>
  4 #include<sys/types.h>
  5 #include<sys/ipc.h>
  6 #include<sys/shm.h>
  7 #include<string.h>
  8 #define _PATH_ "."
  9 #define _PROJ_ID_ 0x757
 10 #define _SIZE_ 4*1024
 11 static int shm(size_t size,int flags);
 12 int creat_shm(size_t size);
 13 int get_shm(size_t size);
 14 void* at_shm(int shm_id);
 15 int dt_shm(const void* shmadd);
 16 int destory_shm(int shm_id);
 //comm.c
  1 #include"comm.h"
  2 static int _shm(size_t  size,int flags)
  3 {
  4     key_t _key=ftok(_PATH_,_PROJ_ID_);
  5     if(_key<0)
  6     {
  7         perror("ftok");
  8         return -1;
  9     }
 10     int shm_id=shmget(_key,size,flags);
 11     if(shm_id<0)
 12     {
 13         perror("shmget");
 14         return -1;
 15     }
 16     return shm_id;
 17 }
 18 int creat_shm(size_t size)
 19 {
 20     return _shm(size,IPC_CREAT|IPC_EXCL|0666);
 21 }
 22 int get_shm(size_t size)
 23 {
 24     return _shm(size,IPC_CREAT);
 25 }
 26 void* at_shm(int shm_id)
 27 {
 28     return shmat(shm_id,NULL,0);
 29 }
 30 int dt_shm(const void* shmadd)
 31 {
 32     return shmdt(shmadd);
 33 }
 34 int destory_shm(int shm_id)
 35 {
 36     if(shmctl(shm_id,IPC_RMID,NULL)<0)
 37     {
 38         perror("shmctl");
 39         return -1;
 40     }
 41     return 0;
 42 }
 //server.c
  1 #include"comm.h"
  2 int main()
  3 {
  4     int shm_id=creat_shm(_SIZE_);
  5     char* buf=(char*)at_shm(shm_id);
  6     //memset(buf,'\0',_SIZE_);
  7     while(1)
  8     {
  9         printf("%s\n",buf);
 10         sleep(1);
 11     }
 12     dt_shm(buf);
 13     destory(buf);
 14 }
 //client.c
  1 #include"comm.h"
  2 int main()
  3 {
  4     int shm_id=get_shm(_SIZE_);
  5     if(shm_id<0)
  6     {
  7         printf("get_shm error\n");
  8         return -1;
  9     }
 10     char* buf=(char*)at_shm(shm_id);
 11     memset(buf,'\0',_SIZE_);
 12     int i=0;
 13     while(i<_SIZE_-1)
 14     {
 15         sleep(1);
 16         buf[i++]='A';
 17     }
 18     dt_shm(buf);
 19     return 0;
 20 }
 //Makefile
  1 .PHONY:all
  2 all:server client
  3 server:server.c comm.c
  4     gcc -o $@ $^
  5 client:client.c comm.c
  6     gcc -o $@ $^
  7 .PHONY:clean
  8 clean:
  9     rm -f server client

实验结果:打开两个终端

wKioL1cQdznC-ZhKAAAlIpG0vFY707.png

wKioL1cQdzmCSSQ4AAALoVWDvVY293.png

使用信号量的Makefile

 cp ../2016_4_11/libmysem.a .

 cp ../2016_4_11/comm.h .

 mkdir lib

 

mkdir lib

[lxj@localhost 2016_4_14]$ cd lib

[lxj@localhost lib]$ cp ../comm.h .

[lxj@localhost lib]$ cp ../libmysem.a  .

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