共享内存是进程间通信方式中效率最高的,由内核创建,少了两次拷贝,直接操作共享内存。
优点:高效。
缺点:不提供同步与互斥。
//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
实验结果:打开两个终端
使用信号量的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
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。