六 Linux 共享儲存

2021-07-25 03:24:51 字數 3539 閱讀 3237

#include

#include

int shmget(key_t  key, size_t  size, int  shm***)

功能:得到乙個共享記憶體識別符號或建立乙個共享記憶體物件並返回共享記憶體識別符號 引數

key0(ipc_private):會建立新共享記憶體物件

//一般應用于父程序和子程序之間

大於0的

32位整數:視引數

shm***

來確定操作。

size

大於0的整數:新建的共享記憶體大小,以位元組為單位

0:只獲取共享記憶體時指定為0

shm*** 

(一般新建時寫成(ipc_creat

|0664),其中

0664

是其屬性)

0:取共享記憶體識別符號,若不存在則函式會報錯

ipc_creat:當

shm***&ipc_creat

為真時,如果核心中不存在鍵值與

key相等的共享記憶體,則新建乙個共享記憶體;如果存在這樣的共享記憶體,返回此共享記憶體的識別符號

ipc_creat 

|ipc_excl:如果核心中不存在鍵值 與

key相等的共享記憶體,則新建乙個共享記憶體;如果存在這樣的共享記憶體則報錯

函式返回值

成功:返回共享記憶體的識別符號

出錯:-1,錯誤原因存於

error中

附加說明

上述shm***引數為模式標誌引數,使用時需要與

ipc物件訪問許可權(如

0600

)進行|

運算來確定訊號量集的訪問許可權

錯誤**

einval:引數

size

小於shmmin

或大於shmmax

eexist:預建立

key所指的共享記憶體,但已經存在

eidrm:引數

key所指的共享記憶體已經刪除

enospc:超過了系統允許建立的共享記憶體的最大值

(shmall)

enoent:引數

key所指的共享記憶體不存在,而引數

shm***

未設ipc_creat位

eacces:沒有許可權

enomem:核心記憶體不足

在linux環境中,對開始申請的共享記憶體空間進行了初始化,初始值為

0x00。

如果用shmget建立了乙個新的訊息佇列物件時,則

shmid_ds

結構成員變數的值設定如下:

shm_lpid、

shm_nattach

、shm_atime

、shm_dtime

設定為0。

msg_ctime設定為當前時間。

shm_segsz設成建立共享記憶體的大小。

shm***的讀寫許可權放在

shm_perm.mode中。

shm_perm結構的

uid和

cuid

成員被設定成當前程序的有效使用者id,

gid和

cuid

成員被設定成當前程序的有效組id。

#include

#include

int shmctl(int shmid, int  cmd, struct shmid_ds  *buf)

功能:完成對共享記憶體的控制

引數:shmid

共享記憶體識別符號

cmdipc_stat :得到共享記憶體的狀態,把共享記憶體的

shmid_ds

結構複製到

buf中

ipc_set  :改變共享記憶體的狀態,把

buf所指的

shmid_ds

結構中的

uid、

gid、

mode

複製到共享記憶體的

shmid_ds

結構內

ipc_rmid:刪除這片共享記憶體

buf共享記憶體管理結構體。具體說明參見共享記憶體核心結構定義部分

函式返回值

成功:0

出錯:-1,錯誤原因存於

error中

錯誤**

eaccess:引數

cmd為

ipc_stat

,確無許可權讀取該共享記憶體

efault:引數

buf指向無效的記憶體位址

eidrm:識別符號為

shmid

的共享記憶體已被刪除

einval:無效的引數

cmd或

shmid

eperm:引數

cmd為

ipc_set

或ipc_rmid

,卻無足夠的許可權執行

#include

#include

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

函式功能

連線共享記憶體識別符號為shmid的共享記憶體,連線成功後把共享記憶體區物件對映到呼叫程序的位址空間,隨後可像本地空間一樣訪問 引數

msqid

共享記憶體識別符號

shmaddr

指定共享記憶體出現在程序記憶體位址的什麼位置,直

接指定為null

讓核心自己決定乙個合適的位址位置

shm***

shm_rdonly:為唯讀模式,其他為讀寫模式(eg:

0)函式返回值

成功:附加好的共享記憶體位址

出錯:-1,錯誤原因存於

error中

附加說明

fork後子程序繼承已連線的共享記憶體位址。

exec

後該子程序與已連線的共享記憶體位址自動脫離(detach)。程序結束後,已連線的共享記憶體位址會自動脫離

(detach)

錯誤**

eacces:無許可權以指定方式連線共享記憶體

einval:無效的引數

shmid

或shmaddr

enomem:核心記憶體不足

#include

#include

int shmdt(const void *shmaddr)

函式說明

與shmat函式相反,是用來斷開與共享記憶體附加點的位址,禁止本程序訪問此片共享記憶體

引數:shmaddr:連線的共享記憶體的起始位址(

shmat

的返回值)

函式返回值

成功:0

出錯:-1,錯誤原因存於

error中

附加說明

本函式呼叫並不刪除所指定的共享記憶體區,而只是將先前用shmat函式連線(

attach

)好的共享記憶體脫離(

detach

)目前的程序,此時

shmid_ds

結構中的

shm_nattch

計數器值減一(

shm_nattch

儲存的是呼叫該段共享記憶體的程序個數)

錯誤**

einval

:無效的引數

shmaddr

實驗六 共享儲存區通訊

實驗六 共享儲存區通訊 實驗目的 了解和熟悉共享儲存機制 實驗內容 編制一長度為1k的共享儲存區傳送和接收的程式。實驗指導 一 共享儲存區 1 共享儲存區機制的概念 共享儲存區 share memory 是unix系統中通訊速度最高的一種通訊機制。該機制可使若干程序共享主存中的某乙個區域,且使該區域...

mount 掛載linux共享儲存

1.linux 系統 nfs 服務端配置方法如下 1 修改 etc exports,增加共享目錄 export home sunky 10.140.133.23 rw export home sunky1 rw export home sunky2 linux client rw 注 export ...

linux儲存 inode詳解(六)

當劃分磁碟分割槽並格式化的時候,整個分割槽會被劃分為兩個部分,即inode區和data block 實際資料放置在資料區域中 這個inode即是 目錄 檔案 檔案在乙個檔案系統中的唯一標識,需要訪問這個檔案的時候必須先找到並讀取這個檔案的 inode。inode 裡面儲存了檔案的很多重要引數,其中唯...