共享內存同行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進程同時結束