一、共享内存

共享内存是最高效的通信方式,因为不需要一个进程先拷贝到内核,另一个进程在存内核中读取。

二、 ipcs -m 查看共享内存

ipcrm -m 删除共享内存

三、主要函数

shmget 创建

shmctl 删除

shmat 挂接

shmdt 取消挂接

********* man 函数名 查看*****

四、代码实现

comm.h

  1 #pragma once2 #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_ 0x6669 #define _SHM_SIZE_ 409610 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