• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            linux 共享內存的使用

            Posted on 2012-01-02 23:36 S.l.e!ep.¢% 閱讀(2276) 評論(0)  編輯 收藏 引用 所屬分類: Unix

            使用共享內存的目的:
            ?共享內存共享內存是進程間通信中最簡單的方式之一。
            ?共享內存允許兩個或更多進程訪問同一塊內存,就如同 malloc() 函數向不同進程返回了指向同一個物理內存區域的指針。
            ?當一個進程改變了這塊地址中的內容的時候,其它進程都會察覺到這個更改。
            使用共享內存的流程:
            ?1.進程必須首先分配它。
            ?2.隨后需要訪問這個共享內存塊的每一個進程都必須將這個共享內存綁定到自己的地址空間中。
            ?3.當完成通信之后,所有進程都將脫離共享內存,并且由一個進程釋放該共享內存塊。
            分配:
            ?int segment_id = shmget (shm_key, int size , shmflag );
            ?1.進程通過調用shmget(Shared Memory GET,獲取共享內存)來分配一個共享內存塊。 該函數的第一個參數是一個用來標識共享內存塊的鍵值。
            ?彼此無關的進程可以通過指定同一個鍵以獲取對同一個共享內存塊的訪問。
            ?不幸的是,其它程序也可能挑選了同樣的特定值作為自己分配共享內存的鍵值,從而產生沖突。
            ?用特殊常量IPC_PRIVATE作為鍵值可以保證系統建立一個全新的共享內存塊。
            ?2.該函數的第二個參數指定了所申請的內存塊的大小。
            ?因為這些內存塊是以頁面為單位進行分配的,實際分配的內存塊大小將被擴大到頁面大小的整數倍。
            ?3.第三個參數是一組標志,通過特定常量的按位或操作來shmget。這些特定常量包括:
            ?IPC_CREAT:
            ??這個標志表示應創建一個新的共享內存塊。通過指定這個標志,我們可以創建一個具有指定鍵值的新共享內存塊。
            ?IPC_EXCL:
            ??這個標志只能與 IPC_CREAT 同時使用。當指定這個標志的時候,如果已有一個具有這個鍵值的共享內存塊存在,則shmget會調用失敗。
            ??也就是說,這個標志將使線程獲得一個“獨有”的共享內存塊。如果沒有指定這個標志而系統中存在一個具有相通鍵值的共享內存塊,
            ??shmget會返回這個已經建立的共享內存塊,而不是重新創建一個。
            ?模式標志:
            ??這個值由9個位組成,分別表示屬主、屬組和其它用戶對該內存塊的訪問權限。其中表示執行權限的位將被忽略。
            ??指明訪問權限的一個簡單辦法是利用<sys/stat.h>中指定,并且在手冊頁第二節stat條目中說明了的常量指定。
            ??例如,
            ???S_IRUSR和S_IWUSR分別指定了該內存塊屬主的讀寫權限,
            ???S_IROTH和S_IWOTH則指定了其它用戶的讀寫權限。
            綁定和脫離:
            ?pst= shmat(iShm_id, NULL, 0)
            ?一個進程獲取對一塊共享內存的訪問,這個進程必須先調用 shmat(SHared Memory Attach,綁定到共享內存)。
            ?將 shmget 返回的共享內存標識符 SHMID 傳遞給這個函數作為第一個參數。
            ?第二個參數是一個指針,指向您希望用于映射該共享內存塊的進程內存地址;如果您指定NULL則Linux會自動選擇一個合適的地址用于映射。
            ?第三個參數是一個標志位,包含了以下選項:   
            ??SHM_RND
            ???表示第二個參數指定的地址應被向下靠攏到內存頁面大小的整數倍。
            ???如果您不指定這個標志,您將不得不在調用shmat的時候手工將共享內存塊的大小按頁面大小對齊。
            ??SHM_RDONLY
            ???表示這個內存塊將僅允許讀取操作而禁止寫入。 如果這個函數調用成功則會返回綁定的共享內存塊對應的地址。
            ???通過 fork 函數創建的子進程同時繼承這些共享內存塊;
            ???如果需要,它們可以主動脫離這些共享內存塊。
            ???當一個進程不再使用一個共享內存塊的時候應通過調用 shmdt(Shared Memory Detach,脫離共享內存塊)
            ???函數與該共享內存塊脫離。將由 shmat 函數返回的地址傳遞給這個函數。
            ???如果當釋放這個內存塊的進程是最后一個使用該內存塊的進程,則這個內存塊將被刪除。
            ???對 exit 或任何exec族函數的調用都會自動使進程脫離共享內存塊。
            控制和釋放共享內存塊:
            ?shmctl(iShm_id,IPC_RMID,0)<0
            ?調用 shmctl("Shared Memory Control",控制共享內存)函數會返回一個共享內存塊的相關信息。同時 shmctl 允許程序修改這些信息。
            ?該函數的第一個參數是一個共享內存塊標識。要獲取一個共享內存塊的相關信息,則為該函數傳遞 IPC_STAT 作為第二個參數,同時傳遞一個指向一個 struct shmid_ds 對象的指針作為第三個參數。
            ?要刪除一個共享內存塊,則應將 IPC_RMID 作為第二個參數,而將 NULL 作為第三個參數。當最后一個綁定該共享內存塊的進程與其脫離時,該共享內存塊將被刪除。
            ?應當在結束使用每個共享內存塊的時候都使用 shmctl 進行釋放,以防止超過系統所允許的共享內存塊的總數限制。調用 exit 和 exec 會使進程脫離共享內存塊,
            ?但不會刪除這個內存塊。 要查看其它有關共享內存塊的操作的描述,請參考shmctl函數的手冊頁。

            共享內存的總體大小是有限制的,這個大小通過SHMMAX參數來定義(以字節為單位),
            您可以通過執行以下命令來確定 SHMMAX 的值:
            cat /proc/sys/kernel/shmmax

            修改共享內存:
            ?設置 SHMMAX
            ?# >echo "2147483648" > /proc/sys/kernel/shmmax
            ?您還可以使用 sysctl 命令來更改 SHMMAX 的值:
            ?# sysctl -w kernel.shmmax=2147483648
            ?最后,通過將該內核參數插入到 /etc/sysctl.conf 啟動文件中,您可以使這種更改永久有效:
            ?# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
            ====================================================================

            /*********************************************************
            ?*? filename:?ipc.c
            ?*? author:?wjy
            ?*? date:?20110509
            *********************************************************/
            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <errno.h>
            #include <unistd.h>
            #include <sys/types.h>
            #include <sys/ipc.h>
            #include <sys/shm.h>
            #include <sys/stat.h>
            int main(int argc,char *argv[])
            {
            ?key_t shmid;
            ?char *p_addr,*c_addr;
            ?pid_t pid;
            ?if(argc != 2)
            ?{
            ??printf("Usage:program something",argv[0]);
            ??exit(0);
            ?}
            ?if((shmid = shmget(IPC_PRIVATE,1024,S_IRUSR|S_IWUSR)) == -1)
            ?{
            ??printf("create share memory error/n");
            ??exit(1);
            ?}
            ?pid = fork();
            ?if(pid > 0 )
            ?{
            ??p_addr = shmat(shmid,0,0);
            ??memset(p_addr,'/0',1024);
            ??strncpy(p_addr,argv[1],1024);
            ??wait(NULL);
            ?}
            ?else if (pid == 0)
            ?{
            ??sleep(1);
            ??c_addr = shmat(shmid,0,0);
            ??printf("Client get %s/n",c_addr);
            ??exit(0);
            ?}
            ?if(shmctl(shmid,IPC_RMID,0)<0)
            ?{
            ??printf("共享內存釋放出錯!!/n");
            ??return(-1);
            ?}
            ?else
            ??printf("釋放共享內存成功!/n");
            }

            日产精品久久久久久久| 亚洲国产成人久久综合一区77| 国产美女亚洲精品久久久综合| 久久久久久久波多野结衣高潮| 亚洲综合熟女久久久30p| 2021少妇久久久久久久久久| 精品午夜久久福利大片| 色综合久久天天综线观看| 色综合久久中文字幕无码| 97精品伊人久久久大香线蕉| 狠狠色婷婷久久一区二区| 精品国产青草久久久久福利| 久久综合九色综合网站| 免费精品久久久久久中文字幕 | 久久久噜噜噜久久中文字幕色伊伊| 香蕉久久夜色精品国产尤物| 2021久久国自产拍精品| 久久久久久精品成人免费图片| 俺来也俺去啦久久综合网| 一本色道久久综合狠狠躁| 久久综合久久鬼色| 99久久99久久精品国产| 99久久人妻无码精品系列 | 久久久久亚洲AV无码专区体验| 久久久WWW成人免费毛片| 久久99精品国产| 久久午夜无码鲁丝片| 国内精品人妻无码久久久影院导航 | 久久99久久无码毛片一区二区| 久久99国产精品二区不卡| 97久久久久人妻精品专区| 久久久久无码精品国产| 久久天天躁狠狠躁夜夜avapp| 亚洲AV日韩精品久久久久久久| 久久人人爽人人爽人人av东京热| 香蕉久久永久视频| 狠狠色丁香久久婷婷综合蜜芽五月| 三级三级久久三级久久| 久久久久久伊人高潮影院| 影音先锋女人AV鲁色资源网久久| 久久狠狠爱亚洲综合影院|