IPC 共享內存


共享內存解釋:




linux中進程對任何非進程地址空間的訪問都是違法的,因此進程1和進程2是不能直接訪問共享內存區域的,共享內存在進程1和進程2的地址空間中都會映射一段一樣大小的內存區域,全部掛載在該共享內存上的進程都會開闢一樣大小的內存,全部對進程內存的操做都會被同步到共享內存,以此實現進程間的通訊。


建立共享內存的方法:

   
   
   
   
#include<stdio.h>#include<sys/ipc.h>#include<sys/shm.h>#define BUF_SIZE 1024int main(){ int id = shmget(IPC_PRIVATE,BUF_SIZE,0666); if(id==-1) { perror("create shared memory fail"); } system("ipcs -m"); return 0;}



新建立的共享內存上的掛載進程數爲0。

在某個共享內存上掛載進程:



   
   
   
   
#include<stdio.h>#include<sys/types.h>#include<sys/shm.h>#include<stdlib.h>int main(int args,char* argc[]){ if(args<2) { puts("input the shmid!"); exit(-1); } int shmid = atoi(argc[1]); char* addr = shmat(shmid,0,0); if(addr!=(void*)-1) { perror("shmat error"); } system("ipcs"); while(1); return 0;}

shmat的第一個參數是共享內存的id,第二個參數爲0表示進程導入點的內存地址由系統決定,也能夠指定導入點,不過不建議這樣作,第三個參數爲0表示這段內存地址能夠讀寫,返回值爲進程共享內存導入點的地址,若是失敗,返回(void*)-1

開啓三個終端,運行:



發現nattch變爲3,表示目前共有3個進程共享這片內存區域。

從某共享內存上卸載進程:



參數爲shmat的返回值。

使用共享內存進行進城之間的通訊:

   
   
   
   
#include<stdio.h>#include<sys/types.h>#include<sys/shm.h>#include<stdlib.h>int main(int args,char* argc[]){ if(args<3) { puts("error!"); exit(-1); } int shmid = atoi(argc[1]); int oper = atoi(argc[2]); char* addr = shmat(shmid,0,0); if(addr==(void*)-1) { perror("shmat error"); exit(-1); } if(oper==1) // write shared memory { scanf("%s",addr); } else if(oper==2) // read shared memory { printf("%s\n",addr); } return 0;}











相關文章
相關標籤/搜索