共享記憶體,訊號量

2021-08-01 18:54:18 字數 2130 閱讀 8627

一.共享記憶體

共享記憶體:允許兩個不相關的程序訪問同乙個邏輯記憶體。為兩個正在執行的程序之間共享和傳遞資料不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,是非同步通訊,也就是說,在第乙個程序結束對共享記憶體的寫操作之前,並無自動機制可以阻止第二個程序開始對它進行讀取。

int shm_open(const char *name, int oflag, mode_t mode);

int shm_unlink(const char *name);

int ftruncate(int fd, off_t length);

1.munmap()/msync()回寫時機,與實際結果不一致。

2.同乙個程式多次對映檔案,檔案內容的長度與對映內容長度不一至,並且比較隨機

.system v共享記憶體

1.int shmget(key_t key, size_t size, int shm***); 建立/開啟共享記憶體

key:關鍵字, 與核心現有的其他共享記憶體的關鍵字相比較,在比較之後,開啟和訪問都依賴於shmflag引數的內容

ipc_excl與ipc_creat一起使用時,防止乙個現有的記憶體被訪問而被開啟著。一旦程序獲得了給定記憶體段的合法ipc識別符號,接著連線該記憶體,為共享記憶體段命名,shmget函式成功時返回乙個與key相關的共享記憶體識別符號(非負整數),用於後續的共享記憶體函式。呼叫失敗返回-1,不相關的程序可以通過該函式的返回值訪問同一共享記憶體,它代表程式可能要使用的某個資源,程式對所有共享記憶體的訪問都是間接的,程式先通過呼叫shmget函式並提供乙個鍵,再由系統生成乙個相應的共享記憶體識別符號(shmget函式的返回值),只有shmget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。

size以位元組為單位指定需要共享的記憶體容量;

shm***是許可權標誌,它的作用與open函式的mode引數一樣,如果要想在key標識的共享記憶體不存在時,建立它的話,可以與ipc_creat做或操作。

2.int shmctl(int shmid, int cmd, struct shmid_ds *buf);控制管理共享記憶體

shmid:是共享記憶體的控制代碼,是shmget函式返回的共享記憶體識別符號。;

cmd:向共享記憶體傳送的命令

buf:向共享記憶體傳送命令的引數,是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。

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

連線(載入),獲取共享記憶體的位址,獲取成功後,可對其進行讀寫操作,當引數為0時,試著查詢乙個未對映的區域。

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

斷開,刪除一段共享記憶體

shm_id是由shmget函式返回的共享記憶體標識。

shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。

shm_***是一組標誌位,通常為0。

呼叫成功時返回乙個指向共享記憶體第乙個位元組的指標,如果呼叫失敗返回-1.

4.、shmdt函式

將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用。

int shmdt(const void *shmaddr);  

引數shmaddr是shmat函式返回的位址指標,呼叫成功時返回0,失敗時返回-1.

二.訊號量

訊號量是一種計數器,用來控制對多個程序共享的資源所進行的訪問。它們常常被用作乙個鎖機制,在某個程序正在對特定資源進行操作時,訊號量可以防止另乙個程序去訪問它。

1.新建訊號量函式semget():

int semget(key_t key, int nsems, int sem***);

key:fork生成的鍵值

nsems:指定在新的集合中應該建立的訊號量的數目

semflag:開啟訊號量的方式

2.控制訊號量引數semctl():

int semctl(int semid, int semnum, int cmd, ...);

semid:呼叫semget()所返回的值

semum:將要操作的訊號量的編號,它是訊號量集合的索引值

共享記憶體 訊號量

1.共享記憶體 a.int shmget key t key,size t size,int shm 建立共享記憶體 參一 為共享記憶體段命名 參二 size以位元組為單位指定需要共享的記憶體容量 參三 許可權標誌 ipc creat 0644 返回值 共享記憶體識別符號 非負整數 b.void s...

共享記憶體和訊號量

共享記憶體和訊號量實現程序間通訊的另外兩種機制。一.共享記憶體 1.共享記憶體的結構 2.實現共享記憶體的函式 1 shmget 函式 功能 建立共享記憶體 引數 key 共享記憶體的名字 size 共享記憶體的大小 以頁為單位分配資源 返回值 成功返回乙個非負整數,即共享記憶體的識別符號 失敗返回...

共享記憶體 訊號量 例項

include include include include include include include define maxshm 5 定義緩衝區陣列的下標變數個數 定義3個訊號量的內部標識 int fullid int emptyid int mutexid 主函式 int main sl...