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_REMAP 並且 shmaddr 為 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

廣告


  

廣告



廣告