共享記憶體相關係統呼叫
程序間通訊的一種方式就是使用共享記憶體,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)銷燬鎖