Linux程序間通訊 共享記憶體

2022-08-29 20:36:29 字數 1938 閱讀 6936

共享記憶體段預設是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的部分,所以按照乙個作業系統的整體來說,他應該也有著乙個關於位元組流的訊息傳輸,並且要比之前都要快,還要跟我們...