父子进程共享内存通信的三种方法
1. mmap MAP_ANONYMOUS
在支持MAP_ANONYMOUS的系统上,直接用匿名共享内存就可以,
mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, -1, 0);
2. mmap /dev/zero
有些系统不支持匿名内存映射,则能够使用fopen打开/dev/zero文件,然后对该文件进行映射。能够相同达到匿名内存映射的效果。
fd=open("/dev/zero",O_RDWR); if(fd==-1){ printf("open /dev/zero null\n"); return -1; } addr=mmap(NULL,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); if(addr == NULL){ printf("mmap error\n"); return -1; }
3. shmget shmat shmctl
shmget 是老式的system V 共享内存模式,非常多系统都支持这样的方法。
int id; //得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符 id = shmget(IPC_PRIVATE, shm->size, (SHM_R|SHM_W|IPC_CREAT)); if(id==-1){ perror("shmget:"); return -1; } //连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间。随后可像本地空间一样訪问 addr = shmat(id, NULL, 0); if(addr == NULL){ perror("shmat:"); return -1; } //完毕对共享内存的控制 if(shmctl(id, IPC_RMID, NULL)==-1){ perror("shmctl:"); return -1; }