linux网络编程之posix共享内存

时间:2022-05-15 11:40:12

今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始:

linux网络编程之posix共享内存

linux网络编程之posix共享内存

下面编写程序来创建一个共享内存:

linux网络编程之posix共享内存

编译运行:

linux网络编程之posix共享内存

那posix的共享内存存放在哪里呢?上节中学的posix的消息队列是在虚拟文件当中创建一个消息队列,需要我们手工将它挂载到某个目录下才能看到,同样的,posix共享内存也是需要将其挂载,只不过这个挂载操作是由系统完成的,而不用我们人工去操作了,已经挂载到了/dev/shm下了,如下:

linux网络编程之posix共享内存

接下来要介绍的函数为修改共享内存的大小:

linux网络编程之posix共享内存

linux网络编程之posix共享内存

【说明】:实际上ftruncate函数也能修改文件的大小。

下面修改程序来使用一下它:

linux网络编程之posix共享内存

编译运行:

linux网络编程之posix共享内存

linux网络编程之posix共享内存

linux网络编程之posix共享内存

其中struct stat的结构体为:

linux网络编程之posix共享内存

修改程序如下:

linux网络编程之posix共享内存

编译运行:

linux网络编程之posix共享内存

linux网络编程之posix共享内存

linux网络编程之posix共享内存

这个比较简单,实验一下:

linux网络编程之posix共享内存

编译运行:

linux网络编程之posix共享内存

现在我们已经创建了一个共享内存对象,那如何用它呢?则需要用到下面这个函数才行:

linux网络编程之posix共享内存

linux网络编程之posix共享内存

下面来使用一下,映射成功之后,先往内存中写入数据,然后再从内存中来读取:

linux网络编程之posix共享内存

接下来做一个容错处理:

linux网络编程之posix共享内存

实际上映射失败有专门的宏定义,从man帮助中可以得知:

linux网络编程之posix共享内存

所以,用它来代替-1程序会更加可读:

linux网络编程之posix共享内存

编译运行:

linux网络编程之posix共享内存

这是为什么呢?还是从man帮助中来寻找答案:

linux网络编程之posix共享内存

所以问题原因找到了,则修改一下打开方式既可:

linux网络编程之posix共享内存

再次编译运行:

linux网络编程之posix共享内存

有没有成功写入,则需要编写一个读取程序来验证一下:

linux网络编程之posix共享内存

编译运行:

linux网络编程之posix共享内存

实际上可以用过shell命令直接查看共享内存的内容:

linux网络编程之posix共享内存

好了,这次学的东西比较简单,下次继续~