#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
key_t key
-----------------------------------------------
key標識共享內存的鍵值: 0/IPC_PRIVATE。 當key的取值爲IPC_PRIVATE,則函數shmget()將建立一塊新的共享內存;若是key的取值爲0,而參數shmflg中設置了IPC_PRIVATE這個標誌,則一樣將建立一塊新的共享內存。
在IPC的通訊模式下,不論是使用消息隊列仍是共享內存,甚至是信號量,每一個IPC的對象(object)都有惟一的名字,稱爲「鍵」(key)。經過 「鍵」,進程可以識別所用的對象。「鍵」與IPC對象的關係就如同文件名稱之於文件,經過文件名,進程可以讀寫文件內的數據,甚至多個進程可以共用一個文 件。而在IPC的通信模式下,經過「鍵」的使用也使得一個IPC對象能爲多個進程所共用。
Linux系統中的全部表示System V中IPC對象的數據結構都包括一個ipc_perm結構,其中包含有IPC對象的鍵值,該鍵用於查找System V中IPC對象的引用標識符。若是不使用「鍵」,進程將沒法存取IPC對象,由於IPC對象並不存在於進程自己使用的內存中。
一般,都但願本身的程序能和其餘的程序預先約定一個惟一的鍵值,但實際上並非總可能的成行的,由於本身的程序沒法爲一塊共享內存選擇一個鍵值。所以,在 此把key設爲IPC_PRIVATE,這樣,操做系統將忽略鍵,創建一個新的共享內存,指定一個鍵值,而後返回這塊共享內存IPC標識符ID。而將這個 新的共享內存的標識符ID告訴其餘進程能夠在創建共享內存後經過派生子進程,或寫入文件或管道來實現。
int size(單位字節Byte)
-----------------------------------------------
size是要創建共享內存的長度。全部的內存分配操做都是以頁爲單位的。因此若是一段進程只申請一塊只有一個字節的內存,內存也會分配整整一頁(在 i386機器中一頁的缺省大小PACE_SIZE=4096字節)這樣,新建立的共享內存的大小其實是從size這個參數調整而來的頁面大小。即若是 size爲1至4096,則實際申請到的共享內存大小爲4K(一頁);4097到8192,則實際申請到的共享內存大小爲8K(兩頁),依此類推。
int shmflg
-----------------------------------------------
shmflg主要和一些標誌有關。其中有效的包括IPC_CREAT和IPC_EXCL,它們的功能與open()的O_CREAT和O_EXCL至關。
IPC_CREAT 若是共享內存不存在,則建立一個共享內存,不然打開操做。
IPC_EXCL 只有在共享內存不存在的時候,新的共享內存才創建,不然就產生錯誤。
若是單獨使用IPC_CREAT,shmget()函數要麼返回一個已經存在的共享內存的操做符,要麼返回一個新建的共享內存的標識符。若是將 IPC_CREAT和IPC_EXCL標誌一塊兒使用,shmget()將返回一個新建的共享內存的標識符;若是該共享內存已存在,或者返回-1。 IPC_EXEL標誌自己並無太大的意義,可是和IPC_CREAT標誌一塊兒使用能夠用來保證所得的對象是新建的,而不是打開已有的對象。對於用戶的讀 取和寫入許可指定SHM_R和SHM_W,(SHM_R>3)和(SHM_W>3)是一組讀取和寫入許可,而(SHM_R>6)和(SHM_W>6)是全局讀取和寫入許可。
返回值
-----------------------------------------------
成功返回共享內存的標識符;不成功返回-1,errno儲存錯誤緣由。
EINVAL 參數size小於SHMMIN或大於SHMMAX。
EEXIST 預創建key所致的共享內存,但已經存在。
EIDRM 參數key所致的共享內存已經刪除。
ENOSPC 超過了系統容許創建的共享內存的最大值(SHMALL )。
ENOENT 參數key所指的共享內存不存在,參數shmflg也未設IPC_CREAT位。
EACCES 沒有權限。
ENOMEM 核心內存不足。
struct shmid_ds
-----------------------------------------------
shmid_ds數據結構表示每一個新建的共享內存。當shmget()建立了一塊新的共享內存後,返回一個能夠用於引用該共享內存的shmid_ds數據結構的標識符。
include/linux/shm.h
struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms */
int shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
__kernel_time_t shm_dtime; /* last detach time */
__kernel_time_t shm_ctime; /* last change time */
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
unsigned short shm_nattch; /* no. of current attaches */
unsigned short shm_unused; /* compatibility */
void *shm_unused2; /* ditto - used by DIPC */
void *shm_unused3; /* unused */
};
struct ipc_perm
-----------------------------------------------
對於每一個IPC對象,系統共用一個struct ipc_perm的數據結構來存放權限信息,以肯定一個ipc操做是否能夠訪問該IPC對象。
struct ipc_perm {
__kernel_key_t key;
__kernel_uid_t uid;
__kernel_gid_t gid;
__kernel_uid_t cuid;
__kernel_gid_t cgid;
__kernel_mode_t mode;
unsigned short seq;
};html