//shmget創(chuàng)建共享內(nèi)存intshmget(key_tkey,//為共享內(nèi)存段命名size_tsize,//以字節(jié)為單位指定需要共享" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Linux學(xué)習(xí)筆記27——共享內(nèi)存

系統(tǒng) 1838 0

一 共享內(nèi)存

  共享內(nèi)存是由IPC為進(jìn)程創(chuàng)建的一個(gè)特殊的地址范圍,它將出現(xiàn)在該進(jìn)程的地址空間中。其他進(jìn)程可以將同一段共享內(nèi)存連接到它們自己的地址空間中,所有進(jìn)程都可以訪問共享內(nèi)存中的地址。如果某個(gè)進(jìn)程向共享內(nèi)存寫入了數(shù)據(jù),所做的改動(dòng)將立刻被可以訪問同一段共享內(nèi)存的任何其他進(jìn)程看到。

二 相關(guān)函數(shù)

      
        #include <sys/shm.h>
      
      
/ / shmget創(chuàng)建共享內(nèi)存 int shmget(key_t key,      //為共享內(nèi)存段命名
       size_t size,     //以字節(jié)為單位指定需要共享的內(nèi)存容量
int shmflg      //權(quán)限標(biāo)志。允許一個(gè)進(jìn)程創(chuàng)建的共享內(nèi)存可以被共享內(nèi)存的創(chuàng)建者所擁有的進(jìn)程寫入,同時(shí)其他用戶創(chuàng)建的進(jìn)程只能讀取該共享內(nèi)存。
      );           //如果共享內(nèi)存創(chuàng)建成功,返回一個(gè)非負(fù)整數(shù),即共享內(nèi)存標(biāo)識(shí)符,如果失敗,就返回-1

//shmat將共享內(nèi)存連接它在程序進(jìn)入臨界區(qū)域時(shí)設(shè)置信號(hào)量到一個(gè)進(jìn)程的地址空間中
void *shmat( int shm_id,        //由shmget返回的共享內(nèi)存標(biāo)識(shí)符
const void *shm_addr,  //指定的是共享內(nèi)存連接到當(dāng)前進(jìn)程中的地址位置,它通常是一個(gè)空指針,表示讓系統(tǒng)來選擇共享內(nèi)存出現(xiàn)的地址
int shmflg         //一組位標(biāo)志。通常設(shè)為0,讓系統(tǒng)來選擇一個(gè)地址,否則就會(huì)使應(yīng)用程序?qū)τ布囊蕾囆赃^高
      );              //如果調(diào)用成功,返回一個(gè)指向共享內(nèi)存第一個(gè)字節(jié)的指針,如果失敗,返回-1

//shmctl控制共享內(nèi)存
int shmctl( int shm_id,        //shmget返回的共享內(nèi)存標(biāo)識(shí)符
       int
cmd,          //要采取的動(dòng)作,可以取3個(gè)值: IPC_STAT,IPC_SET,IPC_RMID

struct shmid_ds * buf   //是一個(gè)指向包含共享內(nèi)存模式和訪問權(quán)限的結(jié)構(gòu)
      );              //成功時(shí)返回0,失敗時(shí)返回-1

//shmdt將共享內(nèi)存從當(dāng)前進(jìn)程中分離
int shmdt( const void * shm_addr);  //參數(shù)是shmat返回的地址指針。成功時(shí)返回0,失敗時(shí)返回-1

?shmctl中第二個(gè)參數(shù)的取值:
  IPC_STAT:把shmid_ds結(jié)構(gòu)中的數(shù)據(jù)設(shè)置為共享內(nèi)存的當(dāng)前關(guān)聯(lián)值
  IPC_SET:如果進(jìn)程有足夠的權(quán)限,就把共享內(nèi)存的當(dāng)前關(guān)聯(lián)值設(shè)置為shmid_ds結(jié)構(gòu)中給出的值
  IPC_RMID:刪除共享內(nèi)存段

      
        
          struct
        
        
           shmid_ds{ uid_t shm_perm.uid; uid_t shm_perm.gid; mode_t shm_perm.mode; }
        
      
    

?

三 例子

shm_com.h

      
        #define
      
       TEXT_SZ 2048




      
        struct
      
      
         shared_use_st{

    
      
      
        int
      
      
         written_by_you;

    
      
      
        char
      
      
         some_text[TEXT_SZ];

};
      
    

shm1.c

      #include <unistd.h>
      
        

#include 
      
      <stdlib.h>
      
        

#include 
      
      <stdio.h>
      
        

#include 
      
      <
      
        string
      
      .h>
      
        



#include 
      
      <sys/shm.h>
      
        

#include 
      
      
        "
      
      
        shm_com.h
      
      
        "
      
      
        int
      
      
         main(){

    
      
      
        int
      
       running =
      
        1
      
      
        ;

    
      
      
        void
      
       *shared_memory=(
      
        void
      
      *)
      
        0
      
      
        ;

    
      
      
        struct
      
       shared_use_st *
      
        shared_stuff;

    
      
      
        int
      
      
         shmid;

    

    srand((unsigned 
      
      
        int
      
      
        )getpid());

    shmid
      
      =shmget((key_t)
      
        1234
      
      ,
      
        sizeof
      
      (
      
        struct
      
       shared_use_st),
      
        0666
      
      |
      
        IPC_CREAT);

    

    
      
      
        if
      
      (shmid==-
      
        1
      
      
        ){

        fprintf(stderr,
      
      
        "
      
      
        shmget failed\n
      
      
        "
      
      
        );

        exit(EXIT_FAILURE);

    }

    
      
      
        //
      
      
        現(xiàn)在可以讓程序訪問這個(gè)共享內(nèi)存
      
      

    shared_memory=shmat(shmid,(
      
        void
      
      *)
      
        0
      
      ,
      
        0
      
      
        );

    
      
      
        if
      
      (shared_memory==(
      
        void
      
      *)-
      
        1
      
      
        ){

        fprintf(stderr,
      
      
        "
      
      
        shmat failed\n
      
      
        "
      
      
        );

        exit(EXIT_FAILURE);

    }

    printf(
      
      
        "
      
      
        Memory attached at %X\n
      
      
        "
      
      ,(
      
        int
      
      
        )shared_memory);

    

    
      
      
        //
      
      
        將shared_memory分配給shared_stuff,然后它輸出written_by_you中的文本
      
      

    shared_stuff=(
      
        struct
      
       shared_use_st *
      
        )shared_memory;

    shared_stuff
      
      ->written_by_you=
      
        0
      
      
        ;

    
      
      
        while
      
      
        (running){

        
      
      
        if
      
      (shared_stuff->
      
        written_by_you){

            printf(
      
      
        "
      
      
        You wrote:%s
      
      
        "
      
      ,shared_stuff->
      
        some_text);

            sleep(rand()
      
      %
      
        4
      
      
        );

            shared_stuff
      
      ->written_by_you=
      
        0
      
      
        ;

            
      
      
        if
      
      (strncmp(shared_stuff->some_text,
      
        "
      
      
        end
      
      
        "
      
      ,
      
        3
      
      )==
      
        0
      
      
        ){

                running
      
      =
      
        0
      
      
        ;

            }

        }

    }

    
      
      
        if
      
      (shmdt(shared_memory)==-
      
        1
      
      
        ){

        fprintf(stderr,
      
      
        "
      
      
        shmdt failed\n
      
      
        "
      
      
        );

        exit(EXIT_FAILURE);

    }

    
      
      
        if
      
      (shmctl(shmid,IPC_RMID,
      
        0
      
      )==-
      
        1
      
      
        ){    

        fprintf(stderr,
      
      
        "
      
      
        shmctl(IPC_RMID) failed\n
      
      
        "
      
      
        );

        exit(EXIT_FAILURE);

    }

    exit(EXIT_SUCCESS);

}
      
    

shm2.c

      #include <stdio.h>
      
        

#include 
      
      <stdlib.h>
      
        

#include 
      
      <
      
        string
      
      .h>
      
        

#include 
      
      <unistd.h>
      
        



#include 
      
      <sys/shm.h>
      
        

#include 
      
      
        "
      
      
        shm_com.h
      
      
        "
      
      
        int
      
      
         main(){

    
      
      
        int
      
       running=
      
        1
      
      
        ;

    
      
      
        void
      
       *shared_memory=(
      
        void
      
       *)
      
        0
      
      
        ;

    
      
      
        struct
      
       shared_use_st *
      
        shared_stuff;

    
      
      
        char
      
      
         buffer[BUFSIZ];

    
      
      
        int
      
      
         shmid;

    

    shmid
      
      =shmget((key_t)
      
        1234
      
      ,
      
        sizeof
      
      (
      
        struct
      
       shared_use_st),
      
        0666
      
      |
      
        IPC_CREAT);

    

    
      
      
        if
      
      (shmid==-
      
        1
      
      
        ){

        fprintf(stderr,
      
      
        "
      
      
        shmget failed\n
      
      
        "
      
      
        );

        exit(EXIT_FAILURE);

    }

    shared_memory
      
      =shmat(shmid,(
      
        void
      
      *)
      
        0
      
      ,
      
        0
      
      
        );

    

    
      
      
        if
      
      (shared_memory==(
      
        void
      
       *)-
      
        1
      
      
        ){

        fprintf(stderr,
      
      
        "
      
      
        shmat failed\n
      
      
        "
      
      
        );

        exit(EXIT_FAILURE);

    }

    printf(
      
      
        "
      
      
        Memory attached at %X\n
      
      
        "
      
      ,(
      
        int
      
      
        )shared_memory);

    

    shared_stuff
      
      =(
      
        struct
      
       shared_use_st *
      
        )shared_memory;

    
      
      
        while
      
      
        (running){

        
      
      
        while
      
      (shared_stuff->written_by_you==
      
        1
      
      
        ){

            sleep(
      
      
        1
      
      
        );

            printf(
      
      
        "
      
      
        Waiting for client...\n
      
      
        "
      
      
        );

        }

        printf(
      
      
        "
      
      
        Enter some text:
      
      
        "
      
      
        );

        fgets(buffer,BUFSIZ,stdin);

        strncpy(shared_stuff
      
      ->
      
        some_text,buffer,TEXT_SZ);

        shared_stuff
      
      ->written_by_you=
      
        1
      
      
        ;

        

        
      
      
        if
      
      (strncmp(buffer,
      
        "
      
      
        end
      
      
        "
      
      ,
      
        3
      
      )==
      
        0
      
      
        ){

            fprintf(stderr,
      
      
        "
      
      
        shmdt failed\n
      
      
        "
      
      
        );

            exit(EXIT_FAILURE);

        }

    }

    
      
      
        if
      
      (shmdt(shared_memory)==-
      
        1
      
      
        ){

        fprintf(stderr,
      
      
        "
      
      
        shmdt failed\n
      
      
        "
      
      
        );

        exit(EXIT_FAILURE);

    }

    exit(EXIT_SUCCESS);

}
      
    

?



Linux學(xué)習(xí)筆記27——共享內(nèi)存


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 在线观看亚洲国产 | 欧美亚洲一区二区三区在线 | 国产激情久久久久久影院 | 男人看片网站 | 精品四虎免费观看国产高清 | 日韩小视频在线播放 | 久久久午夜精品 | 日本久久久久一级毛片 | 欧美视频在线看 | 亚洲欧美日韩中文字幕在线一区 | 日本精品高清一区二区不卡 | 看全色黄大色大片免费久久久 | 久久国产精品久久精品国产 | 日本不卡在线播放 | 最新国产区 | 免费的性生活视频 | 久久国产精彩视频 | 日本综合欧美一区二区三区 | 久久成人亚洲 | 欧美激情(一区二区三区) | 99久久精品国产交换 | 涩综合| 99精品国产自产在线观看 | 国产日韩一区二区三区在线观看 | 国产精品免费久久久久影院 | 97av视频在线播放 | 亚洲自拍成人 | 91在线公开视频 | 爽爽影院免费观看视频 | aⅴ在线免费观看 | 97综合久久 | 真人午夜a一级毛片 | 天天做天天玩天天爽天天 | 尤物黄色| 国产综合视频 | 不卡的| 久久久婷婷 | 99热在| 久久国产精品影院 | 熊出没之重启未来免费观看 | 在线第一福利视频观看 |