我们在前面的进程管理文章中描述过进程的虚拟内存模型
那么我们在共享内存的时候其实是两个步骤,首先需要在内存中开辟一段空间作为共享内存,然后需要把内存中的共享内存映射到每个进程的虚拟内存中,完成通信
首先可以通过ipcs -m来查看当前系统中有没有共享内存
我们发现,目前还没有
1 shmget函数
该函数用来创建共享内存,它的原型为:int shmget(key_t key, size_t size, int shmflg);
第一个参数是一个唯一标示符
第二个参数是以字节为单位指定需要共享的内存容量
第三个参数是权限标志位,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存
返回值:成功返回shm_id,错误返回-1
这是第一步,我们开辟一个共享内存区域
第二步是映射到进程的虚拟内存空间
2 shmat函数
函数原型:void *shmat(int shm_id, const void *shm_addr, int shmflg);
第一个参数是shmget函数返回的shm_id
第二个参数是指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址
第三个参数是一组标志位,通常为0
返回值:调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1
3 shmdt函数
该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。它的原型如下:
int shmdt(const void *shmaddr);
参数shmaddr是shmat函数返回的地址指针,调用成功时返回0,失败时返回-1
我们来看一个例子:
建立两个进程,一个写,一个读,使用共享内存
执行结果:
再用ipcs -m看一下
我们发现共享内存开辟成功了
接下来我们是在另外一个进程中把共享内存的内容读出来
运行结果:
我们发现成功读出来了。
好了,Linux进程间通信之共享内存就总结到这里,如有问题,欢迎指正,谢谢。