程序間通訊 共享記憶體

2021-08-10 20:57:38 字數 1800 閱讀 8979

1.共享記憶體(shared memory)是最快的ipc,多個程序同時對一段記憶體位址操作,它沒有同步機制,

所以需要同步,常把訊號量和共享記憶體結合起來使用。

2.相關函式:#include

建立共享記憶體:int shmget(key_t key, size_t size, int flag);

建立或獲取乙個共享記憶體:成功返回共享記憶體id,失敗返回-1

連線共享記憶體:void *shmat(int shm_id, const void *addr, int flag);

連線共享記憶體到當前程序的位址空間:成功返回指向共享記憶體的指標,失敗返回-1

斷開共享連線:int shmdt(void *addr);

斷開與共享記憶體的連線:成功返回0,失敗返回-1

控制共享連線:int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

控制共享記憶體的相關資訊:成功返回0,失敗返回-1

struct shmid_ds  

;  #define text_sz 2048  

struct shared_use_st  

//將共享記憶體連線到當前程序的位址空間

shm = shmat(shmid, 0, 0);

if(shm == (void*)-1)

printf("\nmemory attached at %x\n", (int)shm);

//設定共享記憶體

shared = (struct shared_use_st*)shm;

shared->written = 0;

while(running)//讀取共享記憶體中的資料

else//有其他程序在寫資料,不能讀取資料

sleep(1);

} //把共享記憶體從當前程序中分離

if(shmdt(shm) == -1)

//刪除共享記憶體

if(shmctl(shmid, ipc_rmid, 0) == -1)

exit(exit_success);

}

//shmwrite

#include #include #include #include #include #include "shmdata.h"

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)//向共享記憶體中寫資料

//向共享記憶體中寫入資料

printf("enter some text: ");

fgets(buffer, bufsiz, stdin);

strncpy(shared->text, buffer, text_sz);

//寫完資料,設定written使共享記憶體段可讀

shared->written = 1;

//輸入了end,退出迴圈(程式)

if(strncmp(buffer, "end", 3) == 0)

running = 0;

} //把共享記憶體從當前程序中分離

if(shmdt(shm) == -1)

sleep(2);

exit(exit_success);

}

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...