共享記憶體段預設是32m位元組。
共享記憶體常用函式:
無關程序(非親緣程序)共享記憶體的方法:
使用共享記憶體的優缺點:
缺點:需要借助外部的同步機制
共享記憶體的使用例子,建立兩個程序,shmwrite向共享記憶體寫資料,shmread從共享記憶體讀資料:
#include #include#include
#include
struct
shared_use_st
;int
main()
//將共享記憶體連線到當前程序的位址空間
shm = shmat(shmid, 0, 0
);
if(shm == (void*)-1
)
printf(
"\nmemory attached at %x\n
", (int
)shm);
//設定共享記憶體
shared = (struct shared_use_st*)shm;
shared->wirte_read_flag = 0; //
設為可寫
while(running) //
讀取共享記憶體中的資料
else
//有其他程序在寫資料,不能讀取資料
sleep(1
);
} //把共享記憶體從當前程序中分離
if(shmdt(shm) == -1
)
//刪除共享記憶體
if(shmctl(shmid, ipc_rmid, 0) == -1
)
exit(exit_success);
}
#include #include#include
#include
#include
struct
shared_use_st
;int
main()
//將共享記憶體連線到當前程序的位址空間
shm = shmat(shmid, (void*)0, 0
);
if(shm == (void*)-1
)
printf(
"memory attached at %x\n
", (int
)shm);
//設定共享記憶體
shared = (struct shared_use_st*)shm;
while(running) //
向共享記憶體中寫資料
//向共享記憶體中寫入資料,向程序的位址空間shm裡寫就相當於往共享記憶體裡寫!
printf("
enter some text:
");
fgets(buffer, bufsiz, stdin);
strncpy(shared->text, buffer, 1024
);
//寫完資料,設定written使共享記憶體段可讀
shared->wirte_read_flag = 1
;
//輸入了end,退出迴圈
if(strncmp(buffer, "
end", 3) == 0
) running = 0
; }
//把共享記憶體從當前程序中分離
if(shmdt(shm) == -1
)
sleep(
2);
exit(exit_success);
}
(ps:以上程式**
Linux程序間通訊 共享記憶體
共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...
Linux程序間共享記憶體通訊
使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...
Linux程序間通訊 共享記憶體
之前提到了程序間通訊的管道,訊息佇列,訊號量,然後其中訊號量是pv操作,操控的是乙個共享資源。在我們提到的ipc模組中,訊息佇列針對的是資料單元的資訊傳送,管道不屬於system v ipc的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...