重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
共享内存是进程间通信方式中效率最高的,由内核创建,少了两次拷贝,直接操作共享内存。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序定制开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了前锋免费建站欢迎大家使用!
优点:高效。
缺点:不提供同步与互斥。
//comm.h 1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 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