2 18 共享記憶體通訊

2021-07-22 17:15:09 字數 3095 閱讀 3507

1.  基本概念

共享記憶體是ipc機制中的一種,作用是使得兩個不相關的程序訪問同一段記憶體,是一種程序間傳輸資料的一種有效方式。

2.  函式學習

2.1  建立/獲取共享記憶體

函式名:

shmget

函式原型: man shmget

int shmget(key_t key, size_t size, int shm***);

函式功能:

建立或者獲取共享記憶體,並返回其描述符(shmid)。

所屬標頭檔案:

返回值:

成功 :返回共享記憶體描述符(shmid)        失敗 :返回-1

引數說明

key :共享記憶體的鍵值。

size :共享記憶體的大小。

shm*** :開啟標誌,如果使用了ipc_creat,則會新建立一塊共享記憶體。

2.2  對映共享記憶體

函式名:

shmat

函式原型: man shmat 

void *shmat(int shmid, const void *shmaddr, int shm***);

函式功能:

把shmid指定的共享記憶體對映到程序的位址空間裡。

所屬標頭檔案:

返回值:

失敗 :返回-1

引數說明:

shmid :要對映的共享記憶體的描述符。

shm*** :標誌。

2.3  脫離共享記憶體

函式名:

shmdt

函式原型:man shmdt 

int shmdt(const void *shmaddr);

函式功能:

從程序位址空間中斷掉與共享記憶體的聯絡。

所屬標頭檔案:

返回值:

成功 :返回0

失敗 :返回-1

引數說明:

2.4  刪除共享記憶體

函式名:

shmctl

函式原型: man shmctl 

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

函式功能:

控制共享記憶體。

所屬標頭檔案:

返回值:

成功 :根據的操作返回不同的值        失敗 :返回-1

引數說明:

shmid :要控制的共享記憶體id。

cmd :要執行什麼樣的控制操作,如ipc_rmid表示刪除。

*buf :獲取linux中描述共享記憶體的shmid_ds結構,該引數基本不用。

2.5  獲取使用者輸入的字串

函式名:

fgets

函式原型: man fgets 

char *fgets(char *s, int size, file *stream);

函式功能:

獲取使用者從鍵盤上的輸入的字串。

所屬標頭檔案:

返回值:

引數說明:

*s :獲取到的字串放到**。

size :要放入多大的字串。

*stream :從**獲取的字串。

2.6  複製字串

函式名:

strncpy

函式原型: man strncpy 

char *strncpy(char *dest, const char *src, size_t n);

函式功能:

把乙個位址的字串複製到另乙個位址。

所屬標頭檔案:

返回值:

引數說明:

n :複製的字串大小。

3.  綜合例項

/*  touch write.c  */

#include

#include

#include

#include

#include

#include

#include

#define text_sz 2048

struct shared_user_st

;int main()

//2.對映共享記憶體

shared_stuff = (struct shared_user_st *)shmat(shmid, null, 0);

//3.迴圈獲取使用者輸入字串並放入共享記憶體

while(running)

fgets(buffer, text_sz, stdin);

strncpy(shared_stuff->some_text, buffer, text_sz);

shared_stuff->written_by_you = 1;

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

}//4.脫離共享記憶體

shmdt((const void *)shared_stuff);

return 0;

}/*  touch read.c  */

#include

#include

#include

#include

#include

#include

#include

#define text_sz 2048

struct shared_user_st

;int main()

//2.對映共享記憶體

shared_stuff = (struct shared_user_st *)shmat(shmid, null, 0);

shared_stuff->written_by_you = 0;

//3.迴圈列印共享記憶體

while(running)

if(0 == strncmp(shared_stuff->some_text, "end", 3))

}//4.脫離共享記憶體

shmdt((const void *)shared_stuff);

//5.刪除共享記憶體

shmctl(shmid, ipc_rmic, 0);

return 0;

}

程序通訊 共享記憶體

定義 共享記憶體,就是通過核心操作,在記憶體上開闢一塊供多個程序共同訪問的記憶體塊。這塊記憶體塊的建立和 銷毀是由核心來控制 當然,也可以在程序內部呼叫系統庫函式來建立和銷毀,類似於訊息機制和訊號 量機制 在這個記憶體塊上,程序可以像操作記憶體一樣操作共享區記憶體。作用 第乙個,就是提供程序間大資訊...

程序通訊共享記憶體

共享記憶體是允許多個程序共享記憶體 共享記憶體結構 struct shmid ds struc ipc permshm perm 指向該記憶體指標 int shm segsz 共享記憶體的大小 ushort shm lkcnt 共享記憶體被鎖定的時間 pid t shm cpid 最近呼叫shomp...

linux通訊 共享記憶體

共享記憶體是效率最高的程序間通訊方式 程序可以直接讀寫記憶體,不需要任何資料的拷貝。多個程序共享一段記憶體,因此與需要依靠某種同步機制,如互斥鎖和訊號燈等。建立開啟共享記憶體 shmget share memory get 對映共享記憶體 shmat share memory attach 撤銷共享...