Linux進程間通信——使用共享內存


一、什么是共享內存

不同進程之間共享的內存通常安排為同一段物理內存。進程可以將同一段共享內存連接到它們自己的地址空間中,所有進程都可以訪問共享內存中的地址,就好像它們是由用C語言函數malloc分配的內存一樣。而如果某個進程向共享內存寫入數據,所做的改動將立即影響到可以訪問同一段共享內存的任何其他進程。

 

 

 特點:

1. 共享內存在各種進程間通信方式中具有最高的效率。訪問共享內存區域和訪問進程獨有的內存區域一樣快,並不需要通過系統調用或者其它需要切入內核的過程來完成。同時它也避免了對數據的各種不必要的復制。

2. 共享內存並未提供同步機制,需要其他機制來同步對共享內存的訪問,例如信號量

二、相關函數

它們聲明在頭文件 sys/shm.h中。

1. shmget:創建共享內存

int shmget(key_t key, size_t size, int shmflg);

第一個參數是內核中唯一的key,可以用ftok函數生成,hmget函數成功時返回一個與key相關的共享內存標識符(非負整數),用於后續的操作都是用那個返回值了。

2. shmat:將一個共享內存段映射到調用進程的數據段中

第一次創建完共享內存時,它還不能被任何進程訪問,shmat函數的作用就是用來啟動對該共享內存的訪問,並把共享內存連接到當前進程的地址空間。它的原型如下:

void *shmat(int shm_id, const void *shm_addr, int shmflg);
第一個參數,shm_id是由shmget函數返回的共享內存標識。
第二個參數,shm_addr指定共享內存連接到當前進程中的地址位置,通常為空,表示讓系統來選擇共享內存的地址。
第三個參數,shm_flg是一組標志位,通常為0。
調用成功時返回一個指向共享內存第一個字節的指針
3. shmd函數
將共享內存從當前進程中分離,注意,將共享內存分離並不是刪除它,只是使該共享內存對當前進程不再可用。
int shmdt(const void *shmaddr);

4. shmctl

用來控制共享內存,例如, IPC_RMID:刪除共享內存段

#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <unistd.h>
using namespace std;

int main()
{
  char *shmaddr;
  char *shmaddread;
  char str[]="Hello, I am a processing. \n";
  int shmid;

  key_t key = ftok(".",1);
  pid_t pid1 = fork();
  if(pid1 == -1){
    cout << "Fork error. " << endl;
    exit(1);
  }
  else if(pid1 == 0){
    //子進程1
    shmid = shmget(key,1024,IPC_CREAT | 0600);
    shmaddr = (char*)shmat(shmid, NULL, 0);
               strcpy(shmaddr, str);
    cout << "[Writer] write: " << shmaddr << endl;
    shmdt(shmaddr);
  }
  else
  {
    //父進程
    pid_t pid2 = fork();
    if(pid2 == -1){
      cout << "Fork error. " << endl;
      exit(1);
    }
    else if(pid2 == 0){
      //子進程2
      sleep(2);
      shmid = shmget(key,1024,IPC_CREAT | 0600);
      shmaddread = (char*)shmat(shmid, NULL, 0);        
      cout << "[Reader] read: " << shmaddread << endl;
      shmdt(shmaddread);
    }
  }
  sleep(3);
  return 0;
}

 

參考鏈接:

1. https://blog.csdn.net/ljianhui/article/details/10253345

2. https://blog.ailemon.me/2018/03/19/the-theory-and-implemention-on-five-ways-for-communication-between-processings/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM