国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux 進(jìn)程間通訊共享內(nèi)存方式

2020-05-27 13:47:34
字體:
供稿:網(wǎng)友

  共享內(nèi)存方式:從物理內(nèi)存里面拿出來一部分作為多個(gè)進(jìn)程共享。

  共享內(nèi)存是進(jìn)程間共享數(shù)據(jù)的一種最快的方法,一個(gè)進(jìn)程向共享內(nèi)存區(qū)域?qū)懭霐?shù)據(jù),共享這個(gè)內(nèi)存的所有進(jìn)程都可以立即看到其中內(nèi)容。

  共享內(nèi)存實(shí)現(xiàn)步驟:

  一、創(chuàng)建共享內(nèi)存,使用shmget函數(shù)。

  二、映射共享內(nèi)存,將這段創(chuàng)建的共享內(nèi)存映射到具體的進(jìn)程空間去,使用shmat函數(shù)。

  創(chuàng)建共享內(nèi)存shmget:

  intshmget(key_t key, size_t size, int shmflg)

  功能:得到一個(gè)共享內(nèi)存標(biāo)識符或創(chuàng)建一個(gè)共享內(nèi)存對象并返回共享內(nèi)存標(biāo)識符。

  key: 0(IPC_PRIVATE)會建立共享內(nèi)存對象

  size:大于0的整數(shù),新建共享內(nèi)存的大小,以字節(jié)為單位。只獲取共享內(nèi)存時(shí),指定為0.

  shmflg:

  0表示取共享內(nèi)存標(biāo)識符,如不存在則函數(shù)會報(bào)錯(cuò);

  IPC_CREAT,如果內(nèi)核中不存在鍵值與key相等的共享內(nèi)存時(shí),則創(chuàng)建一個(gè)共享內(nèi)存;如果存在這樣的共享內(nèi)存則返回共享內(nèi)存的標(biāo)識符;

  IPC_CREAT|IPC_EXCL: 如果內(nèi)核中不存在鍵值與key相等的共享內(nèi)存,則新建一個(gè)消息隊(duì)列;如果存在這樣的共享內(nèi)存則報(bào)錯(cuò);

  函數(shù)返回值:成功則返回內(nèi)存的標(biāo)識符;出錯(cuò)則返回-1,錯(cuò)誤原因存在于error中

  映射共享內(nèi)存到調(diào)用進(jìn)程的地址空間shmat:

  void*shmat(int shmid, const void *shmaddr, int shmflg)

  msqid:共享內(nèi)存標(biāo)識符

  shmaddr:指定共享內(nèi)存出現(xiàn)在進(jìn)程內(nèi)存地址的什么位置,直接指定為NULL讓內(nèi)核自己決定一個(gè)合適的地址位置。

  shmflg: SHM_RDONLY 只讀模式,其他為讀寫模式

  函數(shù)返回值:成功則返回附加好的共享內(nèi)存地址;出錯(cuò)返回-1,錯(cuò)誤原因存在于error中

  斷開共享內(nèi)存連接shmdt:

  intshmdt(const void *shmaddr)

  功能:傳入shmaddr,連接共享的內(nèi)存起始地址;斷開成功則返回0,出錯(cuò)則返回-1,錯(cuò)誤原因存在于error中。

  父子進(jìn)程間通訊實(shí)例:

  #include

  #include

  #include

  #include

  #include

  #include

  int main(int argc, char **argv){

  if(argc< 2){ //需要輸入共享的數(shù)據(jù)

  printf("pleaseinput the shared data.n");

  exit(-1);

  }

  intshmid;

  shmid= shmget(0,1024,IPC_CREAT);

  if(shmid== -1){ // 申請共享內(nèi)存失敗

  printf("createshare memory failed.n");

  exit(-1);

  }

  if(fork()){ // 父進(jìn)程之中

  char*p_shmaddr;

  p_shmaddr= shmat(shmid, NULL, 0); // 映射到父進(jìn)程之中的一個(gè)地址

  memset(p_shmaddr,0, 1024); // 初始化共享內(nèi)存

  strcpy(p_shmaddr,argv[1]); // 拷貝共享數(shù)據(jù)到共享內(nèi)存

  wait(NULL); //等待子進(jìn)程結(jié)束

  exit(0);

  }

  else{

  sleep(2); //等待父進(jìn)程寫入數(shù)據(jù)

  char*c_shmaddr;

  c_shmaddr= shmat(shmid,NULL,0); // 映射到子進(jìn)程之中一個(gè)地址,具體由kernel 指配

  printf("theshare data is: %sn", c_shmaddr); //子進(jìn)程輸出共享的數(shù)據(jù)

  exit(0);

  }

  }

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 太保市| 榆社县| 南通市| 泾源县| 甘孜| 康马县| 永春县| 宝丰县| 高密市| 临江市| 吴江市| 宜兴市| 怀集县| 三原县| 固原市| 兴和县| 阿拉善左旗| 阿坝| 两当县| 蓬安县| 平果县| 明光市| 成安县| 舞钢市| 盈江县| 武平县| 右玉县| 丹江口市| 蒲江县| 常宁市| 鹤庆县| 武川县| 元阳县| 浙江省| 沾化县| 微山县| 邢台县| 伊宁市| 抚顺市| 仙居县| 越西县|