Linux --進程間通信--共享內存

一、共享內存

    共享內存是最高效的通信方式,因爲不需要一個進程先拷貝到內核,另一個進程在存內核中讀取。

二、 ipcs -m 查看共享內存

   ipcrm -m 刪除共享內存

三、主要函數

    shmget 創建

    shmctl 刪除

    shmat 掛接

    shmdt 取消掛接

********* man 函數名 查看*****

四、代碼實現

    comm.h

  1 #pragma once
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<unistd.h>
  5 #include<sys/ipc.h>
  6 #include<sys/shm.h>
  7 #define _PATH_ "."
  8 #define _PROJID_ 0x666
  9 #define _SHM_SIZE_ 4096
 10 int getShmget();
 11 int destoryShm(int shm_id);
 12 char* at_shm(int shm_id);
 13 int delete_Shm(char *addr);

comm.c

  1 #include"comm.h"
  2 int getShmget()
  3 {
  4     key_t key=ftok(_PATH_,_PROJID_);
  5 
  6     int shmflg=IPC_CREAT |0666;
  7     int shm_id=shmget(key,_SHM_SIZE_,shmflg);
  8     if(shm_id<0)
  9     {
 10         perror("shmget");
 11         return -1;
 12     }   
 13     return shm_id;
 14 }   
 15 
 16 int destoryShm(int shm_id)
 17 {
 18     return shmctl(shm_id,IPC_RMID,NULL);
 19 }   
 20 
 21 char* at_shm(int shm_id)
 22 {
 23     return (char*)shmat(shm_id,NULL,0);
 24 }
 25 int delete_Shm(char *addr)
 26 {
 27     return shmdt(addr);
 28 }

client.c

  1 #include"comm.h"
  2 int main()
  3 {
  4     int shm_id=getShmget();
  5     char *addr=at_shm(shm_id);
  6     int i=0;
  7     for(;i<_SHM_SIZE_;i++)
  8     {
  9         addr[i ]='A';
 10         addr[i+1]='\0';
 11         sleep(1);
 12     }   
 13     delete_Shm(addr);
 14     return 0;
 15 }

server.c

  1 #include"comm.h"
  2 int main()
  3 {
  4     int shm_id=getShmget();
  5     char * addr=at_shm(shm_id);
  6     int i=0;
  7     for(;i<_SHM_SIZE_;i++)
  8     {
  9         printf("%s\n",addr);
 10         sleep(1);
 11     }
 12     delete_Shm(addr);
 13     destoryShm(shm_id);
 14     return 0;
 15 }

運行結果

wKioL1cQj3LTm-1QAAKNoA_IxzY768.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章