共享記憶體是ipc機制中的第二個。他允許連個不相關的程序訪問同一塊邏輯記憶體,能夠有效地實現兩個程序間資料傳遞。
int shmget(key_t key,sizr_t size,int shm***);建立共享記憶體
key為共享記憶體段的命名,size為以位元組為單位的記憶體容量,shm***包含9位元許可權標識,和建立檔案的mode一樣,由ipc_creat建立共享記憶體段時必須和許可權標識按位或。
建立成功返回非負整數,失敗返回-1.
void* shmat(int shm_id, void *shm_addr,int shm***);//啟動共享記憶體,連線位址空間
shm_id 為shmget返回的共享內的識別符號;shm_addr指定的事當前程序中的位址位置。通常是個空指標,標識讓系統來選擇共享記憶體出現的位址;shm***有兩個可能的取值shm_rnd(和shm_addr聯合使用控制共享記憶體連線位址)和shm_rdonly(使連線的記憶體為唯讀)
shmdt 作用是將共享記憶體從程序中分離,成功時為0,失敗返回-1
int shmctl(int shm_id,int command,struct shmid_ds *buf); 共享記憶體控制函式
shm_id 是shmget返回的共享記憶體識別符號;command是要採取的動作,可以取3個值;buf是乙個指標,包含共享記憶體模式和訪問許可權的結構。
我們建立乙個shm1.c(消費者) shm2.c(生產者)和乙個分發共享記憶體標頭檔案shm_com.h
shm_com.h
#define text_sz 2048
struct shared_usr_st
;
shm1.c
#include #include #include #include #include #include "shm_com.h"
int main()
//啟動共享記憶體,連線位址空間
shared_memory = shmat(shmid,(void*)0,0);
if(shared_memory == (void*)-1)
printf("memory attached at% x\n",(int)shared_memory);
shared_stuff = (struct shared_usr_st *)shared_emory;
shared_stuff->written_by_you = 0;
//迴圈等待生產者送來的內容並列印輸出
while(running)}}
//將共享記憶體從程序中剝離
if(shmdt(shared_memory)==-1)
//刪除共享記憶體
if(shmctl(shmid,ipc_rmid,0)==-1)
exit(exit_success);
}
shm2.c
#define bufsiz 2048
#include #include #include #include #include #include "shm_com.h"
int main()
shared_memory = shmat(shmid,(void*)0,0);
if(shared_memory == (void*)-1)
printf("memory attached at% x\n",(int)shared_memory);
shared_stuff = (struct shared_usr_st *)shared_emory;
//生產者向共享記憶體空間發放產品
while(running)
printf("enter some text: ");
fgets(buffer,bufsiz,stdin);
strncpy(shared_stuff->some_text,buffer,text_sz);
//放入產品後將標識置1
shared_stuff->written_by_you = 1;
if(strncmp(shared_stuff->some_text,"end",3)==0)}}
if(shmdt(shared_memory)==-1)
exit(exit_success);
}
輸出結果:
./shm1 &
memory attached at 8fc35000
./shm2
memory attached at d2485000
enter some text: neil
you wrote: neil
waiting for client...
waiting for client...
enter some text: test
you wrote: test
waiting for client...
enter some text: on
you wrote: on
waiting for client...
waiting for client...
waiting for client...
enter some text: shared_memmory!!!
you wrote: shared_memmory!!!
waiting for client...
enter some text: end
有一點比較疑惑,輸出的記憶體位址為什麼不相同,按理說應該相同的
擴充套件的話可以做不止乙個產品的生產者消費者問題
這裡同步標誌位為written_by_you 是通過忙等待來達到同步效果,非常缺乏效率,在實際應用中應該會用訊號量或者訊息傳遞等來實現有效的同步機制。
Linux程序通訊 共享記憶體
對於linux來講,不同程序之間的記憶體是不能讀寫的,乙個程序只能讀寫自己所屬的記憶體。a程序是不能讀寫b程序記憶體的?如果程式確實想通過記憶體交換資料怎麼辦?linux提供共享記憶體機制。共享記憶體是由核心處於多個程序間交換資訊的目的而留出的一塊記憶體區 段 共享記憶體也需要設定相關許可權的。這段...
Linux程序通訊 共享記憶體
共享記憶體 共享記憶體是一種最為高效的程序間通訊方式,在程序間通訊時核心專門的留出一塊記憶體區。在這段記憶體區可以由訪問程序將其對映到自己的私有位址空間。因此程序就可以直接讀寫這一塊記憶體區,極大的提高了效率。共享記憶體的步驟 1 建立共享記憶體 2 對映貢獻記憶體 原理 相關函式 shmget 建...
linux 程序 共享記憶體通訊
1.概述 該demo主要實現linux下程序之間的共享記憶體通訊,相關介面介紹可以參考 2.場景 半雙工 父程序簡單地通過共享記憶體將資料傳送給子程序 3.測試 程序程式設計demo 共享記憶體 ipc相關的命令 ipcs ipcrm 釋放ipc 檢視程序屬性 ulimit a include in...