當前位置:編程學習大全網 - 源碼下載 - linux***享內存存在於進程空間的什麽位置

linux***享內存存在於進程空間的什麽位置

***享內存方式:從物理內存裏面拿出來壹部分作為多個進程***享。***享內存是進程間***享數據的壹種最快的方法,壹個進程向***享內存區域寫入數據,***享這個內存的所有進程都可以立即看到其中內容。***享內存實現步驟:壹、創建***享內存,使用shmget函數。二、映射***享內存,將這段創建的***享內存映射到具體的進程空間去,使用shmat函數。創建***享內存shmget:intshmget(key_t key, size_t size, int shmflg)功能:得到壹個***享內存標識符或創建壹個***享內存對象並返回***享內存標識符。key: 0(IPC_PRIVATE)會建立***享內存對象size:大於0的整數,新建***享內存的大小,以字節為單位。只獲取***享內存時,指定為0.shmflg:0表示取***享內存標識符,如不存在則函數會報錯;IPC_CREAT,如果內核中不存在鍵值與key相等的***享內存時,則創建壹個***享內存;如果存在這樣的***享內存則返回***享內存的標識符;IPC_CREATIPC_EXCL: 如果內核中不存在鍵值與key相等的***享內存,則新建壹個消息隊列;如果存在這樣的***享內存則報錯;函數返回值:成功則返回內存的標識符;出錯則返回-1,錯誤原因存在於error中映射***享內存到調用進程的地址空間shmat:void*shmat(int shmid, const void *shmaddr, int shmflg)msqid:***享內存標識符shmaddr:指定***享內存出現在進程內存地址的什麽位置,直接指定為NULL讓內核自己決定壹個合適的地址位置。shmflg: SHM_RDONLY 只讀模式,其他為讀寫模式函數返回值:成功則返回附加好的***享內存地址;出錯返回-1,錯誤原因存在於error中斷開***享內存連接shmdt:intshmdt(const void *shmaddr)功能:傳入shmaddr,連接***享的內存起始地址;斷開成功則返回0,出錯則返回-1,錯誤原因存在於error中。父子進程間通訊實例:#include #include #include #include #include #include int main(int argc, char **argv){if(argc< 2){ //需要輸入***享的數據printf("pleaseinput the shared data.n");exit(-1);}intshmid;shmid= shmget(0,1024,IPC_CREAT);if(shmid== -1){ // 申請***享內存失敗printf("createshare memory failed.n");exit(-1);}if(fork()){ // 父進程之中char*p_shmaddr;p_shmaddr= shmat(shmid, NULL, 0); // 映射到父進程之中的壹個地址memset(p_shmaddr,0, 1024); // 初始化***享內存strcpy(p_shmaddr,argv[1]); // 拷貝***享數據到***享內存wait(NULL); //等待子進程結束exit(0);}else{sleep(2); //等待父進程寫入數據char*c_shmaddr;c_shmaddr= shmat(shmid,NULL,0); // 映射到子進程之中壹個地址,具體由kernel 指配printf("theshare data is: %sn", c_shmaddr); //子進程輸出***享的數據exit(0);}}

  • 上一篇:穿越父子文..
  • 下一篇:請教大神:TP-LINK的WR885N硬件版本1.0和2.0有啥區別?
  • copyright 2024編程學習大全網