IPC 共享内存
共享内存解释:

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;}


浙公网安备 33010602011771号