您好,登錄后才能下訂單哦!
共享內(nèi)存是進(jìn)程間通信方式中效率最高的,由內(nèi)核創(chuàng)建,少了兩次拷貝,直接操作共享內(nèi)存。
優(yōu)點(diǎn):高效。
缺點(diǎn):不提供同步與互斥。
//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
實(shí)驗(yàn)結(jié)果:打開兩個終端
使用信號量的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
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。