Linux程式設計常用的函式(五) 共享記憶體

2021-04-14 22:23:53 字數 1807 閱讀 1708

(五)共享記憶體

1.核心為每個共享記憶體設定了乙個 shmid_ds結構,它的成員如下:

struct shmid_ds

2.includeint shmget(key_t key, size_t size, int flag);//建立共享記憶體

size指的是共享記憶體段的格式n*sizeof(int)則共享記憶體段將用來儲存int型別資料n個

成功返回乙個對應於共享記憶體段識別符號的非負整數,不成功返回-1並設定errno,錯誤碼:

eacces   key的共享識別符號存在,但沒有授予相關的許可權

eexist   key的共享識別符號存在,但((shm***&ipc_creat) && (shm***&ipc_excl)!=0

einval   要建立共享記憶體段,但size是無效的

einval   沒有共享記憶體段要建立,但size與系統設定的限制或與key所代表的共享段的長度不相符

enoent   key的共享記憶體表示符不存在,但(shm***&ipc_creat)== 0

enomem   沒有足夠的記憶體空間來建立指定的共享記憶體段

enospc   要超出系統範圍內對共享識別符號的限制了

功能:shmget函式返回乙個與引數key相關的共享記憶體段識別符號。

如果鍵位ipc_creat或者shm***&ipc_creat非零,而且沒有共享記憶體段或識別符號與key相關聯,函式就建立這個段,共享記憶體段被初始化為零。

3. int shmctl(int shmid, int cmd, struct shmid_ds *buf);//共享記憶體的控制

成功返回0,不成功返回-1並設定errno,錯誤碼:

eacces   cmd為ipc_stat,但是呼叫程式沒有讀許可權

einval   shmid或cmd的值無效

eperm   cmd為ipc_rmid或ipc_set,呼叫程式沒有正確的許可權

cmd值:

ipc_rmid 刪除共享記憶體段,並銷毀相應的shmid_ds

ipc_set   用buf中的值來設定共享記憶體段shmid的字段值

ipc_stat 將共享記憶體段shmid中的當前值拷貝到buf中去

ipc_lock 將共享記憶體段鎖定在記憶體中(只有超級使用者可以執行)

ipc_unlock 解鎖共享記憶體

4.void *shmat(int shmid, const void *shmaddr, int shm***);//共享記憶體段的連線

eacces   呼叫程式的操作許可權別否定

einvla   shmid和shmaddr的無效

emfile   連線到程序上的共享記憶體段的樹木超出了限制

enomem 程序資料空間不足以容納共享記憶體段

功能:函式將shmid指定的共享記憶體段連線到呼叫程序的位址空間,並為shmid增加shm_nattch的值。

如果shmaddr為0,則此段連線到由核心選擇的第乙個可用的位址上

如果shmaddr非0,並且沒有指定shm_rnd,則此段連線到addr所指定的位址上

如果shmaddr非0,並且指定了shm_rnd,則此段連線到(addr-(addr mod ulus shmlba))所表示的位址上。

5. int shmdt(const void *shmaddr);//分離共享記憶體

成功返回0,不成功返回-1並設定errno,錯誤碼:

einval shmaddr不對應於共享記憶體段的起始位址

功能:用完乙個共享記憶體,呼叫其來分離共享記憶體段,並對shm_nattch進行減操作。

最後乙個分離共享記憶體段的程序應該通過呼叫shmctl來釋放共享記憶體段

Linux網路程式設計常用函式

計算機資料儲存有兩種位元組優先順序 高位位元組優先和低位位元組優先。internet上資料以高位位元組優先順 序在網路上傳輸,所以對於在內部是以低位位元組優先方式儲存資料的機器,在internet上傳輸資料時就需 要進行轉換。我們要討論的第乙個結構型別是 struct sockaddr,該型別是用來...

Linux程式設計 共享記憶體

共享記憶體簡介 1 共享記憶體 不相關的程序訪問同乙個邏輯記憶體 2 程序將同一段共享記憶體對映到自己的位址空間中 3 對共享記憶體訪問的同步控制必須由程式設計師來負責 基本函式 共享記憶體相關函式標頭檔案 include 建立或者獲取共享記憶體,都是通過它實現 int shmget key t k...

Linux 網路程式設計常用函式詳解

sendto 經socket傳送資料 相關函式 send sendmsg,recv recvfrom socket 表頭檔案 include sys types.h include sys socket.h 定義函式 int sendto int s const void msg,int len,u...