共享內存同行,王明學learn

                  共享內存同行linux

1、共享內存概念函數

   共享內存是IPC機制中的一種,它容許兩個不相關的進程訪問同一段內存, 這是傳遞數據的一種很是有效的方式。學習

2、函數學習spa

  這裏主要有建立共享內存、映射共享內存、分離共享內存、控制共享內存code

2.1建立/打開共享內存blog

1).函數名 進程

  shmget ip

2).函數原型內存

  int shmget(key_t key,size_t size,int shmflg) 字符串

3).函數功能 

  建立或者獲取共享內存,並返回描述符id 

4).所屬頭文件 

  <sys/ipc.h><sys/shm.h> 

5).返回值 

  成功:返回建立或者獲取到的共享內存 

  失敗:-1 

6).參數說明

  key:共享內存的鍵值

   size:共享內存的大小 

  shmflg:打開標誌、若是使用了IPC_CREAT,則會新建立一塊共享內存 

2.2映射共享內存 

1).函數名 

  shmat 

2).函數原型 

  void  *shmat(int shmid,const void *shmaddr,int shmflg) 

3).函數功能

  把shmid指定的共享內存映射到進程的的地址空間裏 

4).所屬頭文件 

  <sys/types.h><sys/shm.h> 

5).返回值 

  成功:返回映射到進程空間以後的內存地址 

  失敗:-1 

6).參數說明 

  shmid:要映射的共享內存的描述符 

  shmaddr:指定映射以後的地址,可是通常狀況都讓該參數爲NUUL,標明讓linux系統自動的選擇映射地址 

  shmflg:標誌 

2.3分離共享內存 

1).函數名 

  shmdt 

2).函數原型

  int  shmdt(const void *shmaddr) 

3).函數功能 

  從進程地址空間中,斷掉與共享內存的聯繫

4).所屬頭文件 

  <sys/types.h><sys/shm.h> 

5).返回值 

  成功:0 

  失敗:-1 

6).參數說明 

  shmaddr:指明要斷開共享內存的映射地址 

2.4控制共享內存

1).函數名 

  shmctl 

2).函數原型 

  int shmctl(int shmid,int cmd,struct shmid_ds *buf) 

3).函數功能

  控制共享內存 

4).所屬頭文件 

  <sys/ipc.h><sys/shm.h> 

5).返回值 

  成功:根據不一樣的操做返回不一樣的值 

  失敗:-1 

6).參數說明 

  shmid:要控制的共享內存的id 

  cmd:決定執行什麼樣的控制操做,如使用IPC_RMID表示刪除 

  buf:獲取linux中描述共享內存的shmid_ds結構,基本不使用 

3、共享內存通訊

3.1write進程主要完成建立共享內存----->映射共性內存----->脫離共享內存這幾個任務 

 1 #include <sys/ipc.h>
 2 #include <sys/shm.h>  
 3 #include <sys/types.h>
 4 #include <stdio.h>
 5 #include <unistd.h>
 6 #include <stdlib.h>
 7 
 8 #define  TEXT_SIZE 2048
 9 struct shared_use_st 10 { 11     int written_buy_you; 12     char some_text[TEXT_SIZE]; 13 }; 14 
15 
16 int main() 17 { 18     int running = 1; 19     struct shared_use_st *shared_stuff; 20     int shmid; 21     char buffer[TEXT_SIZE]; 22     
23     //1建立共享內存
24     shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT); 25     if(shmid==-1) 26  { 27         printf("creat share memory fail!\n"); 28  exit(EXIT_FAILURE); 29  } 30     
31     //2映射共享內存
32     shared_stuff = (struct shared_use_st*)shmat(shmid,NULL,0); 33     
34     //3循環 
35     while(running) 36  { 37         while(shared_stuff->written_buy_you == 1) 38  { 39             sleep(1); 40             printf("wait read process!\n"); 41  } 42         
43         //獲取用戶輸入
44  fgets(buffer,TEXT_SIZE,stdin); 45         
46         //將用戶輸入的字符串放入共享內存
47         strncpy(shared_stuff->some_text,buffer,TEXT_SIZE); 48         shared_stuff->written_buy_you = 1; 49         
50         if(strncmp(buffer,"end",3)==0) 51             running =0; 52  } 53         
54      //4脫離共享內存
55     shmdt((const void *)shared_stuff); 56     
57     return 1; 58 }

3.2read進程主要完成建立/獲取共享內存------>映射共享內存-------->循環打印共享內存中的字符串----->直到結束----->脫離共享內存------>刪除共享內存

 1 #include <sys/ipc.h>
 2 #include <sys/shm.h>  
 3 #include <sys/types.h>
 4 #include <stdio.h>
 5 #include <unistd.h>
 6 #include <stdlib.h>
 7 
 8 #define  TEXT_SIZE 2048
 9 struct shared_use_st 10 { 11     int written_buy_you; 12     char some_text[TEXT_SIZE]; 13 }; 14 
15 int main() 16 { 17     int shmid; 18     struct  shared_use_st *shared_stuff; 19     int running = 1; 20     //獲取共享內存
21     shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT); 22     
23     //映射共享內存
24     shared_stuff = (struct shared_use_st *)shmat(shmid,NULL,0); 25     //循環
26     while(running) 27  { 28         //打印共享內存
29         if(shared_stuff->written_buy_you == 1) 30  { 31             printf("write process write %s\n",shared_stuff->some_text); 32                shared_stuff->written_buy_you = 0; 33               
34             if(strncmp(shared_stuff->some_text,"end",3)==0) 35                 running = 0; 36  } 37  } 38     //脫離共享內存
39     shmdt((const void *)shared_stuff); 40     
41     //刪除共享內存
42     shmctl(shmid,IPC_RMID,0); 43     return 0; 44 }

4、編譯read.c和write.c運行./read和write能夠獲得write打印出的字符如圖所示,write輸入end時候read和write進程同時結束

相關文章
相關標籤/搜索