shmop() - Unix,Linux系統呼叫 - 技術教學
Tutorials Point


  Unix入門
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考資料     討論論壇     關於TP  

shmop() - Unix,Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

shmop - 共享記憶體操作

概要

 
#include <sys/types.h>
 
#include <sys/shm.h>

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

int shmdt(const void *shmaddr);

描述

shmat() 將由shmid標識的共享記憶體段附加到呼叫程序的地址空間。附加地址由shmaddr指定,並符合以下標準之一:

如果shmaddr為NULL,系統將選擇合適的(未使用的)地址來附加段。

如果shmaddr不為NULL並且在shmflg中指定了SHM_RND,則附加發生在等於shmaddr向下舍入到SHMLBA的最近倍數的地址。否則,shmaddr必須是頁面對齊的地址,附加在此地址處發生。

如果在shmflg中指定了SHM_RDONLY,則附加段用於讀取,並且程序必須對該段具有讀取許可權。否則,該段用於讀寫,並且程序必須對該段具有讀寫許可權。沒有寫入共享記憶體段的概念。

可以在shmflg中指定(Linux專用)SHM_REMAP標誌,以指示段的對映應替換從shmaddr開始並持續段大小的範圍內任何現有對映。(通常,如果此地址範圍內已存在對映,則會產生EINVAL錯誤。)在這種情況下,shmaddr不能為NULL。

呼叫程序的brk(2)值不會因附加而改變。段將在程序退出時自動分離。同一段可以作為讀段和讀寫段附加,並且在程序的地址空間中可以附加多次。

成功的shmat()呼叫會更新與共享記憶體段關聯的shmid_ds結構(參見shmctl(2))的成員,如下所示:

標籤描述
shm_atime設定為當前時間。
shm_lpid設定為呼叫程序的程序ID。
shm_nattch遞增1。
shmdt() 將位於由shmaddr指定的地址的共享記憶體段從呼叫程序的地址空間分離。要分離的段必須當前附加,並且shmaddr等於附加shmat()呼叫返回的值。
在成功的shmdt()呼叫中,系統會更新與共享記憶體段關聯的shmid_ds結構的成員,如下所示:
shm_dtime設定為當前時間。
shm_lpid設定為呼叫程序的程序ID。
shm_nattch遞減1。如果它變為0並且該段被標記為要刪除,則該段將被刪除。

系統呼叫

標籤描述
fork() fork()之後,子程序繼承附加的共享記憶體段。
exec() exec()之後,所有附加的共享記憶體段都將從程序中分離。
exit() exit()時,所有附加的共享記憶體段都將從程序中分離。

返回值

成功時,shmat()返回附加共享記憶體段的地址;出錯時,返回(void *) -1,並設定errno以指示錯誤的原因。

成功時,shmdt()返回0;出錯時,返回-1,並設定errno以指示錯誤的原因。

錯誤

shmat()失敗時,errno設定為以下之一:
標籤描述
EACCES 呼叫程序不具有請求的附加型別的所需許可權,並且不具有CAP_IPC_OWNER能力。
EINVAL 無效的shmid值,未對齊(即,未頁面對齊且未指定SHM_RND)或無效的shmaddr值,或在brk()處附加失敗,或指定了SHM_REMAPshmaddr為NULL。
ENOMEM 無法為描述符或頁表分配記憶體。
shmdt()失敗時,errno設定如下:
標籤描述
EINVAL shmaddr處沒有附加的共享記憶體段;或者,shmaddr未對齊到頁面邊界。

備註

使用shmaddr等於NULL的shmat()是附加共享記憶體段的首選可移植方法。請注意,以這種方式附加的共享記憶體段可能在不同的程序中附加到不同的地址。因此,在共享記憶體中維護的任何指標必須設定為相對的(通常相對於段的起始地址),而不是絕對的。

在Linux上,即使共享記憶體段已被標記為要刪除,也可以附加它。但是,POSIX.1-2001沒有指定此行為,許多其他實現也不支援它。

以下系統引數會影響shmat():

標籤描述
SHMLBA 段低邊界地址倍數。必須頁面對齊。對於當前實現,SHMLBA值為PAGE_SIZE
實現對每個程序共享記憶體段的最大數量(SHMSEG)沒有內在限制。

符合標準

SVr4, POSIX.1-2001。

在SVID 3(或可能更早的版本)中,shmaddr引數的型別從char *更改為const void *shmat()的返回型別從char *更改為void *。(Linux libc4和libc5具有char *原型;glibc2具有void *。)

參見



previous next Printer Friendly

廣告


  

廣告



廣告
© . All rights reserved.