共享内存解释:
linux中进程对任何非进程地址空间的访问都是违法的,因此进程1和进程2是不能直接访问共享内存区域的,共享内存在进程1和进程2的地址空间中都会映射一段一样大小的内存区域,全部挂载在该共享内存上的进程都会开辟一样大小的内存,全部对进程内存的操做都会被同步到共享内存,以此实现进程间的通讯。
建立共享内存的方法:
#include<stdio.h>#include<sys/ipc.h>#include<sys/shm.h>#define BUF_SIZE 1024int main(){ int id = shmget(IPC_PRIVATE,BUF_SIZE,0666); if(id==-1) { perror("create shared memory fail"); } system("ipcs -m"); return 0;}
新建立的共享内存上的挂载进程数为0。
在某个共享内存上挂载进程:
#include<stdio.h>#include<sys/types.h>#include<sys/shm.h>#include<stdlib.h>int main(int args,char* argc[]){ if(args<2) { puts("input the shmid!"); exit(-1); } int shmid = atoi(argc[1]); char* addr = shmat(shmid,0,0); if(addr!=(void*)-1) { perror("shmat error"); } system("ipcs"); while(1); return 0;}
shmat的第一个参数是共享内存的id,第二个参数为0表示进程导入点的内存地址由系统决定,也能够指定导入点,不过不建议这样作,第三个参数为0表示这段内存地址能够读写,返回值为进程共享内存导入点的地址,若是失败,返回(void*)-1
开启三个终端,运行:
发现nattch变为3,表示目前共有3个进程共享这片内存区域。
从某共享内存上卸载进程:
参数为shmat的返回值。
使用共享内存进行进城之间的通讯:
#include<stdio.h>#include<sys/types.h>#include<sys/shm.h>#include<stdlib.h>int main(int args,char* argc[]){ if(args<3) { puts("error!"); exit(-1); } int shmid = atoi(argc[1]); int oper = atoi(argc[2]); char* addr = shmat(shmid,0,0); if(addr==(void*)-1) { perror("shmat error"); exit(-1); } if(oper==1) // write shared memory { scanf("%s",addr); } else if(oper==2) // read shared memory { printf("%s\n",addr); } return 0;}