linux系统进程间通信方式(一):共享内存
前言
linux系统可以创建多个用户进程,进程之间有多种通信方式,可以使用system-V的IPC对象进行通信;从本文开始,首先介绍system-V IPC之一的共享内存。
一、了解system-V IPC
(一)什么是SYSTEM-V IPC?
linux系统的内核可以创建一些对象(共享内存、消息队列、信号量),这些对象拥有它们自己的标识符(ID),并且每一个对象都是通过一个唯一的key来绑定(识别)它;多个进程可以这些对象来通信,这些内核中的对象被人们称为system-V IPC。
上面讲的这些IPC对象它是存在于内核中,和进程是相互独立的;进程想使用这些IPC对象,那它怎么知道现在用的是哪一个对象呢?所以需要提供一个唯一的值来识别(绑定)这些IPC对象。那么在linux系统里面怎么获取一个唯一的值呢?我们都知道,对于linux系统来说,一切都是文件,文件是唯一的,那么它的inode节点也是唯一的,所以可以利用它来创建一个唯一的值,也就是上面提到的key。
linux提供了一个api函数ftok,它可以帮我们创建一个唯一的key,来绑定一个IPC对象。(创建key的原理这里简述一下:就是通过文件的inode号和一个用户指定的工程id(proj_id)来制作key,具体怎么生成这里不详细展述)
那么多个进程使用这个相同的key,就可以获取到同一个IPC对象的ID,从而使用同一个IPC对象来进行通信。
下面展示一下linux系统中的IPC对象的有关信息(使用命令ipcs)
注意:输入ipcs -m只显示共享内存;输入ipcs -q只显示消息队列;输入ipcs -s只显示信号量
上述的IPC 对象在内核内部使用链表维护,不同的对象使用 IPC 标识符来标识,如消息队列标识符 msqid、共享内存标识符 shmid,信号量标识符 semid。对于用户来说,内核提供了简洁的接口,不同的进程通过指定的key 就可以访问具体的对象。
(二)system-V IPC的特点
1.独立于进程
2.没有文件名和文件描述符
3.IPC对象具有key和ID
二、使用共享内存实现进程间通信(示例)
1.设计意图
实现两个进程通信,一个进程往共享内存写数据,另一个从共享内存读取数据
2.设计思路
1、首先有两个程序:p1.c、p2.c;
2、这两个程序先后运行之后系统会创建两个进程(下面统称为p1、p2);
3、p1创建一块共享内存、创建两个信号量
4、p2获取这块共享内存、打开信号量
5、p1从键盘获取字符串,然后往共享内存写入数据
6、p2从共享内存读取数据,并打印出数据
7、通信过程使用posix有名信号量实现同步(即p1写完数据p2才能读取数据)
3.代码实现
程序p1.c
程序p2.c
4.调试过程
新建一个普通文件,用于产生key
touch 1
编译程序:
gcc p1.c -o p1 -pthread
gcc p2.c -o p2 -pthread
打开两个终端,先运行p1,再运行p2
在p1所在终端输入数据,回车,效果如下:
从上图可以看出,p1发送了数据,p2接收到了数据并打印出来。
最后在p1终端输入“quit”,退出进程;p2收到“quit”也退出进程,如下图:
5.参考资料
关于共享内存的api函数如何使用,可以参考下面博主的文章:
版权声明:本文为CSDN博主「艾特号」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lpwsw/article/details/121932268
总结
以上就是今天要讲的内容,本文介绍了system-V的IPC对象和它的特点,并简要介绍了共享内存实现进程通信的案例。
关于共享内存操作的内容,今后再补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了