shmget() — 建立共用記憶體

來源:互聯網
上載者:User

 #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,它們的δ苡雘pen()的O_CREAT和O_EXCL相當。
    IPC_CREAT   如果共用記憶體不存在,則建立一個共用記憶體,否則開啟操作。
    IPC_EXCL    只有在共用記憶體不存在的時候,新的共用記憶體才建立,否則就產生錯誤。

    如果單獨使用IPC_CREAT,shmget()函數要麼返回一個已經存在的共用記憶體的操作符,要麼返回一個建立的共用記憶體的標識符。如果將IPC_CREAT和IPC_EXCL標誌一起使用,shmget()將返回一個建立的共用記憶體的標識符;如果該共用記憶體已存在,或者返回-1。IPC_EXEL標誌本身並沒有太大的意義,但是和IPC_CREAT標誌一起使用可以用來保證所得的對象是建立的,而不是開啟已有的對象。對於使用者的讀取和寫入許可指定SHM_RSHM_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;
};
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.