目录
一,共享内存原理
二,创建共享内存
1,shmget创建共享内存
2,shmat挂接共享内存
3,shmdt取消挂接共享内存
4,shmctl删除共享内存
三,代码使用
1,com.hpp
2,ipc_client.cpp
3,ipc_server.cpp
4,makefile
5,log.hpp
四,实验现象
五,添加管道控制
1,封装几个管道接口
2,客户端
3,服务端
4,实验现象
六,代码链接
一,共享内存原理
还是和上一节一样,俩个进程要通信,那么他俩就需要看到同一块资源,如图所示就是他的原理:
所以我们可以知道共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据
二,创建共享内存
四个函数
1,shmget创建共享内存
key需要用户自己提供:
需要用户调用ftok函数来给出:
这里使用和上一节的命名管道差不多,提供相同的路径,和一个int值,生成一个定值key_t,这样俩个进程只要是提供的路径相同,数字相同,就会得到同一个key_t,参考命名管道。
size:创建的大小:
shmflg:创建的方法和权限
IPC_CREAT:没有则创建,有了就返回创建好的。
IPC_EXCL:有了则出错返回,这个不单独使用,和IPC_CREAT,配合,用来保证创建的共享内存是新创建的,而不是以及创建好了。
这个函数的返回值就标定了一块共享内存,并且是唯一标定的。
2,shmat挂接共享内存
shmid:shmget的返回值
shnadder:从哪里挂接,我们一般不知道因该是特殊用途,设置为nullptr就好了,系统自动选择。
shmflag:传0使用默认读写就行了,
shmat的返回值是void* ,参考malloc开出的空间,差不多一样,就当malloc开出的空间那样使用就好了。
3,shmdt取消挂接共享内存
shmat的返回值传入就取消了。
4,shmctl删除共享内存
这里我们主要看删除,是因为共享内存的生命周期不是随进程的,而是随内核的。
第一个参数传shmget返回值,
第二个传IPC_RMID,
第三个是为了设置共享内存信息IPC_SET,或者IPC_STAT输出型参数带回共享内存的信息,用的时候在看文档把。
三,代码使用
整体代码文件有七个,其实主要就三个
makfile是编译代码的
log.hpp搞日志的,为了方便,可以不搞得,
com.hpp头文件
ipc_client:客户端,也就是进程1
ipc_server:服务端,也就是进程2
剩下俩个是生成得可执行程序
1,com.hpp
2,ipc_client.cpp
3,ipc_server.cpp
4,makefile
5,log.hpp
无所谓得这个:
四,实验现象
我们也是发现了,共享内存是没有同步互斥机制得,我们想要同步互斥机制得话可以配合命名管道来使用。
我们关掉进程:发现共享内存没有释放,验证了他是随内核得。
ipccrm -m shmid;手动删除,就没有了
五,添加管道控制
共享内存是没有同步互斥机制得,我们加入一个命名管道来通知他的读取,让他不是随便想读就读。而是在我们写完一句话再去读取,没写完就让他等在那里。
1,封装几个管道接口
管道不会得,前面有讲过哦。
2,客户端
客户端开始时打开管道。
写完之后唤醒
3,服务端
开始时创建管道并打开
在读取得时候按照管道得读取来进行等待
4,实验现象
这就好了,呀就不会随意得读取了,而是和管道同步起来。
六,代码链接
lyh_linux-test: linux代码练习。 - Gitee.com
lyh_linux-test: linux代码练习。 - Gitee.com