91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

共享內存的實現

發布時間:2020-09-03 17:26:35 來源:網絡 閱讀:356 作者:小楊楊雪松 欄目:編程語言

共享內存可以說最有用的進程間通信方式,也是最快的IPC形式。兩個不同進程A,B共享內存的意思是,同一塊物理內存被映射到進程A,B各自的進程地址空間。進程A可以及時看到進程B對共享內存中數據的更新,反之亦然 。由于多個進程共享同一塊內存區域,必然需要某種同步機制 ,互斥鎖和信號量都可以。

采用共享內存通信的一個顯而易見的好處是效率高,因為進程可以直接讀寫內存,而不需要任何數據的拷貝,對于管道和消息隊列等通信方式,則需要在內核和用戶空間進行4次的數據拷貝,而共享內存則只拷貝兩次數據,一次從輸入文件到共享內存區,另一次從共享內存區到輸出文件。實際上,進程之間在共享內存時,并不總是讀寫少量數據后就解除映射,有新的通信時,再重新建立共享內存區域。而是保持共享區域,直到通信完畢為止,這樣數據內容一直保存在共享內存中,并沒有寫回文件,共享內存中的內容是在解除映射時才寫回文件的。因此,采用共享內存的效率是非常高的。

下面我們來寫一段程序來看看共享內存的應用:

comm.c文件:

   #include "comm.h"

   

   int comm_shm_creat(int flag)

   {

       key_t _key=ftok(_PATH_,_PROJ_ID_);

       if(_key<0)

       {

           perror("ftok");

           return -1;

      }

      int shm_id=shmget(_key,_SIZE_,flag);

      if(shm_id<0)

      {

          perror("shmget");

          return -1;

      }

      return shm_id;

  }

  

  int shm_creat()

  {

      umask(0);

      int flag=IPC_CREAT|IPC_EXCL|0666;

      return comm_shm_creat(flag);

  }

  

  int shm_get()

  {

      int flag=IPC_CREAT;

      return comm_shm_creat(flag);

  }

  

  int shm_destroy(int shm_id)                                                                                                                                         

  {

      if(shmctl(shm_id,IPC_RMID,NULL)<0)

      {

            perror("shmctl");

            return -1;

      }

      return 0;                                                                                                                                                       

  }

  

  void* at_shm(int shm_id)

  {

      return shmat(shm_id,NULL,0);

  }

  

  int dt_shm(void *addr)

  {

      return shmdt(addr);

  }

 

shm_server.c文件:

   #include "comm.h"

   

   int main()                                                                                                                                               

   {

       int shm_id=shm_creat();

       char *start=at_shm(shm_id);

       int i=0;

       for(;i<_SIZE_;++i)

       {

          printf("%s\n",start);

          sleep(1);

      }

      dt_shm(start);

      shm_destroy(shm_id);

      return 0;

  }

shm_client.c文件:

 

   #include "comm.h"

   

   int main()

   {

       int shm_id=shm_get();

       char *start=at_shm(shm_id);

       int i=0;

       for(;i<_SIZE_;++i)

       {

          start[i]='A';

          start[i+1]='\0';

          sleep(1);                                                                                                                                                   

      }

      dt_shm(start);

      return 0;

  }

運行結果如下:

 

 共享內存的實現

 

從上圖結果可以看到,他們shmgetID相同,而且client寫的內容被server接收到了,實現了進程間通信的目的。

 

 


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

辽源市| 南宁市| 宜兴市| 乐安县| 成武县| 大石桥市| 二连浩特市| 禹州市| 海盐县| 襄垣县| 商洛市| 锡林郭勒盟| 白银市| 兰考县| 江津市| 通道| 清苑县| 洪湖市| 马关县| 新宾| 望都县| 常山县| 台山市| 封开县| 合江县| 老河口市| 定南县| 北海市| 海盐县| 抚顺市| 大荔县| 民权县| 彭泽县| 泽州县| 隆回县| 黄平县| 大洼县| 万宁市| 乌兰县| 青浦区| 潼南县|