一、什么是共享内存
共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
注意:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。
二、实现步骤
1.创建共享内存 shmget
2.映射共享内存 shmat ,将创建的共享内存映射到进程中
3.解除映射 shmdt
int shmget(key_t key, size_t size, int shmflg); // key的值 0/IPC_PRIVATE IPC_CREATE时创建一块内存 // size 多少字节 // 标志
返回共享内存的标识符
void *shmat(int shmid, const void *shmaddr, int shmflg); // 创建时返回de 共享内存的标识符 // flag 决定以什么方式映射 一般是0 // addr
int shmdt(const void *shmaddr);
linux 中wait用法
进程一旦调用了wait就立即阻塞自己,由wait自动分析是否当前进程的某个子进程已经退出,如果让它找到了这样一个已经变成僵尸的子进程,wait就会收集这个子进程的信息,并把它彻底销毁 后返回;如果没有找到这样一个子进程,wait就会一直阻塞在这里,直到有一个出现为止。
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define PERM S_IRUSR|S_IWUSR /* 共享内存 */ int main(int argc,char **argv) { int shmid; char *p_addr,*c_addr; if(argc!=2) { fprintf(stderr,"Usage:%s\n\a",argv[0]); exit(1); } /* 创建共享内存 */ if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1) { fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno)); exit(1); } /* 创建子进程 */ if(fork()) // 父进程写 { p_addr=shmat(shmid,0,0); // 传 0 代表由系统自动给你指定一个地址 memset(p_addr,'\0',1024); strncpy(p_addr,argv[1],1024); wait(NULL); // 释放资源,不关心终止状态 exit(0); } else // 子进程读 { sleep(1); // 暂停1秒 c_addr=shmat(shmid,0,0); printf("Client get %p\n",c_addr); exit(0); } }