Unix网络编程笔记-IPC(一)

IPC

参考Unix网络编程 卷2

Pipe

Pipe典型用途是进程Fork时父进程和子进程通信。

数据通信中,数据在线路上传输方式有单工通信,半双工通信,全双工通信三种:

  1. 单工通信,它的信道是单向的。发送方和接收方是固定的,例如遥控器和电视;
  2. 半双工通信,可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。也就是说,通信信道的每一段都可以是发送端,也可以是接收端。但同一时刻里,信息只能有一个传输方向。如对讲机;
  3. 全双工通信,可以使数据在两个方向上同时进行传送操作。类似电话通信。RS-422标准就是全双工通信标准。

通信信道(Communication Channel)是数据传输的通路,在计算机网络中信道分为物理信道和逻辑信道。物理信道指用于传输数据信号的物理通路,它由传输介质与有关通信设备组成;逻辑信道指在物理信道的基础上,发送与接收数据信号的双方通过中间结点所实现的逻辑通路,由此为传输数据信号形成的逻辑通路。

基础知识

Pipe提供两个文件描述符,一个用于进程对Pipe进行写操作,而另外一个用于另一个进程对Pipe进行读操作(下面称为写入端和读出端)。

父进程Fork子进程实际上是自身的副本,需要通过通信实现两者的关联。所以进行Fork之前,父进程会创建一个Pipe,供它和子进程双向传输数据。完成派生操作后,父进程关闭Pipe的读出端,子进程关闭Pipe的写入端。

注意,虽然此通道可以实现双向传输,但是其通信信道方向是固定的,也就是数据流方向是固定的

fork时

fork后

C/S通信流程

下面流程以建立双向通信的半双工通信Pipe为例

  1. 父进程创建两个管道,其中Pipe1作为父进程(Client)向子进程请求数据,Pipe2作为子进程(Server)向父进程返回数据;
  2. 父进程程序调用Fork函数,派生子进程;
  3. 父进程关闭Pipe1的读出端;
  4. 父进程关闭Pipe2的写入端;
  5. 子进程关闭Pipe1的写入端;
  6. 子进程关闭Pipe2的读入端。

这里进程的读/写端是根据进程对Pipe的操作进行区分,进程对Pipe进行写操作为写入端,进程从Pipe获取数据为读出端。

C/S通信

从图中可以看到,无论数据是Client到Server还是Server到Client,都需要穿过用户-内核接口两次。

详细流程

父进程创建两个Pipe。并且调用fork函数,派生子进程。

从内核返回至用户程序代码,有可能返回至子进程,也有可能返回至父进程。如果Process ID为0,即为子进程。

如果为父进程,父进程关闭Pipe1的读出端,父进程关闭Pipe2的写入端。将请求的文件在Server中的路径写入Pipe1中,然后等待Pipe2中的返回数据。

控制权转换给子进程,子进程关闭Pipe1的写入端,子进程关闭Pipe2的读入端。接收Pipe1中路径数据,打开文件,并将内容写入Pipe2中或返回错误信息。执行完写操作后,执行exit(0)终止自己。

此时父进程读出Pipe2的数据,并且获取子进程状态,最后终止自己。

全双工管道

SVR4的pipe函数以及许多内核都提供的sockpair函数,返回两个描述符,都可以进行读/写操作的全双工管道。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值