编程步骤:
1.创建共享内存,得到一个共享内存ID(该ID一般大于50000)
2.把ID映射到虚拟地址(也称为“挂载”)
3.操作共享内存
4.卸载虚拟地址
5.删除共享内存
应用案例:
建立2个进程 A 和B 。其中A,创建共享内存,并且修改内存数据。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/shm.h> #include <sys/ipc.h> key_t key; int shmid; int *p; int i=0; void deal(int s) { if(s==SIGINT) { //4.卸载共享内存shmdt shmdt(p); //5.删除共享内存shctl shmctl(shmid,IPC_RMID,0); exit(0); } } main() { signal(SIGINT,deal); //1.创建共享内存shmget key=ftok(".",255); if(key==-1) printf("ftok error:%m "),exit(-1); shmid=shmget(key,4,IPC_CREAT|IPC_EXCL|0666); if(shmid==-1) printf("get error:%m "),exit(-1); //2.挂载共享内存shmat p=shmat(shmid,0,0); if(p==(int*)-1) printf("at error:%m "),exit(-1); //3.访问共享内存 while(1) { *p=i; sleep(1); i++; } }
B。根据ID得到共享内存,并且访问内存数据。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <sys/shm.h> #include <sys/ipc.h> key_t key; int shmid; int *p; void deal(int s) { if(s==2) { //4.卸载共享内存shmdt shmdt(p); exit(0); } } main() { signal(SIGINT,deal); //1.创建共享内存shmget key=ftok(".",255); if(key==-1) printf("ftok error:%m "),exit(-1); shmid=shmget(key,4,0); if(shmid==-1) printf("get error:%m "),exit(-1); //2.挂载共享内存shmat p=shmat(shmid,0,0); if(p==(int*)-1) printf("at error:%m "),exit(-1); //3.访问共享内存 while(1) { sleep(1); printf("%d ",*p); } }