根据提供的国嵌应用开发班课件的信息,“进程通信2”主要介绍了进程间通信中的消息队列和信号量这两种重要的通信机制。接下来,我们将对这两部分的内容进行深入解析。 ### 消息队列 #### 定义 消息队列是UNIX早期通信机制之一,它克服了信号传递信息量有限及管道只能传输无格式字节流的问题,为应用程序提供了更为丰富的通信手段。简单来说,消息队列可以被理解为一个消息的链表结构,其中的消息具有特定的格式。一个进程可以通过特定规则向消息队列中添加新消息,而另一个进程可以从该队列中读取这些消息。 #### 发展 目前有两种主要类型的消息队列:POSIX消息队列和系统V消息队列。系统V消息队列由于其优良的性能和广泛的适用性,在实际应用中得到了更广泛的应用。 #### 分类 - **持续性**:系统V消息队列是随内核持续的,这意味着除非内核重启或人为删除,否则消息队列将一直存在于系统中。 - **键值**:为了确保消息队列的唯一性,每个消息队列都需要有一个唯一的键值与之对应。这个键值是在系统范围内唯一的,用于获取消息队列的描述符。 #### 键值的获取 键值通过调用`ftok()`函数获得,该函数接收两个参数:`pathname`和`proj`。`pathname`指定文件名,`proj`指定项目名(通常只要非零即可)。函数返回与给定路径和项目相关的键值。 #### 打开/创建消息队列 打开或创建消息队列需要调用`msgget()`函数,该函数接收两个参数:`key`和`msgflg`。`key`是由`ftok()`获得的键值,`msgflg`是一组标志位,用于控制消息队列的行为。 - `IPC_CREAT`:当没有与`key`相对应的消息队列时,创建新的消息队列。 - `IPC_EXCL`:与`IPC_CREAT`一起使用,表示如果要创建的消息队列已经存在,则返回错误。 - `IPC_NOWAIT`:在读写消息队列时,如果请求无法立即得到满足,则不阻塞,而是立即返回错误。 #### 创建消息队列的情况 在以下两种情况下,`msgget()`函数将创建一个新的消息队列: - 如果没有与键值`key`相对应的消息队列,并且`msgflg`中包含了`IPC_CREAT`标志位。 - 如果`key`参数设置为`IPC_PRIVATE`,此时将创建一个与系统其他任何消息队列无关的新消息队列。 ### 信号量 信号量是一种用于同步进程访问共享资源的机制,它通过控制进程对共享资源的访问顺序来避免竞态条件的发生。虽然信号量在课件内容中未被详细介绍,但作为进程间通信的重要组成部分,了解信号量的基本概念对于理解进程通信机制至关重要。 #### 基本概念 - **计数器**:信号量实质上是一个计数器,用于记录可用的共享资源数量。 - **P操作**:P操作会使信号量的值减一,如果减一后信号量的值小于0,则执行P操作的进程会被挂起等待。 - **V操作**:V操作会使信号量的值加一,如果加一后信号量的值小于等于0,则唤醒一个因等待该信号量而被挂起的进程。 ### 总结 通过对消息队列和信号量的学习,我们不仅可以更好地理解进程间通信的原理,还能够掌握实现多进程协作的具体方法。无论是消息队列还是信号量,它们都是实现并发程序的基础,对于开发高效稳定的多进程应用至关重要。希望同学们能够深入学习并熟练掌握这些知识点。
- 粉丝: 10
- 资源: 15
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助