1. 程式人生 > >共享記憶體相關係統呼叫

共享記憶體相關係統呼叫

程序間通訊的一種方式就是使用共享記憶體,Linux下與共享記憶體相關的系統呼叫是程式設計的基礎,根據專案中的使用情況,羅列如下。

key_t ftok(constchar * pathname, int id)

系統建立IPC通訊(訊息佇列、訊號量、共享記憶體)時必須指定一個ID值。ftok函式根據一個檔案和子序號生成這樣一個鍵值,唯一標識此資源。

int shmget(key_tkey, size_t size, int shmflg)

建立新的共享記憶體或者獲取一段已經存在的共享記憶體。key唯一標識共享記憶體。如果建立則必須指定size,如果獲取則可以將size設定為0。shmflg是標誌位,標識共享記憶體的屬性。該呼叫成功返回共享記憶體識別符號,失敗返回-1,根據errno,由strerror_r函式獲取錯誤資訊。

void* shmat(intshm_id, void* shm_addr, int shmflg)

將共享記憶體對映到程序地址空間。shm_id是shmget返回的共享記憶體識別符號,shm_addr是共享記憶體被對映到的地址,推薦使用NULL,由系統決定,確保可移植性。成功返回對映地址,失敗返回-1。

int shmdt(constvoid * shm_addr)

取消對映,成功返回0,失敗返回-1。

int shmctl(intshm_id, int command, struct shmid_ds* buf)

控制共享記憶體屬性。刪除共享記憶體時,會將IPC_RMID命令設定上,當最後一個使用該共享記憶體的程序呼叫shmdt後,該共享記憶體被刪除。

共享記憶體使用時需要進行同步管理,一般會同時分配一塊記憶體存放鎖,各程序在使用時先獲取鎖在操作資料讀寫。讀寫鎖相關資料結構和系統呼叫包括:

pthread_rwlock_trwlock 讀寫鎖結構體

pthread_rwlockattr_trwlockattr 讀寫鎖屬性結構體

pthread_rwlockattr_int(&rwlockattr)初始化屬性

pthread_rwlockattr_setpshared(&rwlockattr,PTHREAD_PROCESS_SHARED)設定跨程序共享。

pthread_rwlock_init(&rwlock,&rwlockattr)用屬性初始化讀寫鎖

pthread_rwlockattr_destroy(&rwlockattr)銷燬屬性結構體

pthread_rwlock_rdlock(&rwlock)讀方式加鎖

pthread_rwlock_wrlock(&rwlock)寫方式加鎖

pthread_rwlock_unlock(&rwlock)解鎖

pthread_rwlock_destroy(&rwlock)銷燬鎖