进程间通信

之前讲解了如何创建进程,本章将讨论创建的2个进程之间交换数据的方法。这与构建服务器端无直接关系,但可能有助于构建多种类型服务器端,以及更好地理解操作系统。
11.1 进程间通信的基本概念
进程间通信(Inter Process Communication)意味着两个不同进程间可以交换数据,为了完成这一点,操作系统应提供两个进程可以同时访问的内存空间。
对进程间通信的基本理解

理解进程间通信并没有想象中那么难,进程A和B之间的如下谈话内容就是一种进程间通信规则。

“如果我有1个面包,变量bread的值就变为1.如果吃掉这个面包,bread的值又变回0.因此,你可以通过变量bread值判断我的状态。”
也就是说,进程A通过变量bread将自己的状态通知给了进程B,进程B通过变量bread听到了进程A的话。因此,只要有两个进程可以同时访问的内存空间,就可以通过此空间交换数据。之前所讲,进程具有完全独立的内存结构。就连通过fork函数创建的子进程也不会与父进程共享内存空间。因此,进程间通信只能通过其他特殊方法完成。

各位应该已经明白进程间通信的含义及其无法简单实现的原因,下面正式介绍进程间通信方法。

图11-1表示基于管道(PIPE)的进程间通信结构模型。
在这里插入图片描述

#include <unistd.h>
int pipe(int filedes[2]);
/*
 * 成功时返回0,失败时返回-1
 * filedes[0] 通过管道接收数据时使用的文件描述符,即管道出口
 * filedes[1] 通过管道传输数据时使用的文件描述符,即管道入口
 */

以长度为2的int数组地址值作为参数调用上述函数时,数组中存有两个文件描述符,它们将被用作管道的出口和入口。父进程调用该函数时将创建管道,同时获取对应出入口的文件描述符,此时父进程可以读写同一管道(相信大家也做过这样的实验)。但父进程的目的是与子进程进行数据交换,因此需要将入口或出口的1个文件描述符传递给子进程。如何完成传递呢?答案就是调用fork函数。通过下列示例进行演示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

运行结果应该和大家的预想一致。这次注释第18行代码后在运行(务必亲自动手操作)。虽然这行代码只将代码运行时间延迟了2秒,但已引发运行错误。产生原因是什么呢?

“向管道传递数据时,先读的进程会把数据取走。”

简言之,数据进入管道后称为无主数据。也就是通过read函数先读取数据的进程将得到数据,即使进程将数据传到了管道。因此,注释第18行将产生问题。在第19行,子进程将读回自己在第17行向管道发送的数据。结果,父进程调用read函数后将无限期等待数据进入管道。

从上述示例中可以看到,只用1个管道进行双向通信并非易事。为了实现这一点,程序需要预测并控制运行流程,这在每种系统中都不同,可以视为不可能完成的任务。既然如此,该如何进行双向通信呢?

“创建2个管道。”
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值