实验八、进程间通信
2021/6/19 7:33:16
本文主要是介绍实验八、进程间通信,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
项目 | 内容 |
---|---|
这个作业属于哪个课程 | <班级课程的主页链接 > |
这个作业的要求在哪里 | <作业要求链接接地址> |
学号-姓名 | 18043132-王奕斌 |
作业学习目标 | 1.了解进程间通信的常用方式;2.掌握管道、消息队列、信号量、共享内存实现进程间通信的方法。 |
1.举例说明使用匿名管道进行进程通信。
(1)管道通信
匿名管道:
当进程使用 pipe 函数,就可以打开位于内核中的这个特殊“文件”。同时 pipe 函数会返回两个描述
符,一个用于读,一个用于写。如果你使用 fstat 函数来测试该描述符,可以发现此文件类型为
FIFO 。而无名管道的无名,指的就是这个虚幻的“文件”,它没有名字。
pipe 函数打开的文件描述符是通过参数(数组)传递出来的,而返回值表示打开成功(0)或失败 (-1)。
它的参数是一个大小为 2 的数组。此数组的第 0 个元素用来接收以读的方式打开的描述符,而第 1 个元素用来接收以写的方式打开的描述符。
也就是说, pipefd[0] 是用于读的,而 pipefd[1] 是用于写的。
打开了文件描述符后,就可以使用 read(pipefd[0]) 和 write(pipefd[1]) 来读写数据了。
例题:父进程 fork 出一个子进程,通过无名管道向子进程发送字符,子进程收到数据后将字符串中的小写字符转换成大写并输出。
2. IPC 内核对象
每个 IPC 内核对象都是位于内核空间中的一个结构体。具体的对于共享内存、消息队列和信号量,他
们在内核空间中都有对应的结构体来描述。当你使用 get 后缀创建内核对象时,内核中就会为它开辟
一块内存保存它。只要你不显式删除该内核对象,它就永远位于内核空间中,除非你关机重启
3. 共享内存
例题:编写一个程序 shmctl 可以用来创建、删除内核对象,也可以挂接、卸载共享内存,还可以打
印、设置内核对象信息。具体使用方法具体见下面的说明:
4. 消息队列
消息队列本质上是位于内核空间的链表,链表的每个节点都是一条消息。每一条消息都有自己的消息类
型,消息类型用整数来表示,而且必须大于 0.每种类型的消息都被对应的链表所维护,下图 展示了内
核空间的一个消息队列:
例题:程序 msg_send 和 msg_recv 分别用于向消息队列发送数据和接收数据。 msg_send 程序定义了
一个结构体 Msg ,消息正文部分是结构体 Person 。该程序向消息队列发送了 10 条消息。
5. 信号量
例题:信号量操作 示例
这篇关于实验八、进程间通信的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南