《TCP/IP 网络编程》第 11 章——进程间通信(学习笔记)

代码链接

第 11 章 进程间通信

11.1 进程间通信的基本概念

进程间通信意味着两个不同进程间可以交换数据,为了完成这一点,操作系统中应提供两个进程可以同时访问的内存空间。

11.1.1 对进程间通信的基本理解

11.1.2 通过管道实现进程间通信

为了完成进程间通信,需要创建管道。管道并非属于进程的资源,而是和套接字一样,属于操作系统(也就不是 fork 函数的复制对象)。所以两个进程通过操作系统提供的内存空间进行通信。

下面介绍创建管道的函数。

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

父进程调用该函数时将创建管道,同时获取对应于出入口的文件描述符,此时父进程可以读写同一管道。但父进程的目的是与子进程进行数据交互,因此需要将入口或出口中的 1 个文件描述符传递给子进程。

下面示例进行演示,代码参考 pipe1.c 文件

运行结果

wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ gcc pipe1.c -o pipe1.exe
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ ./pipe1.exe
Who are you?

11.1.3 通过管道进行进程间双向通信

第一种:两个进程通过一个管道进行双向数据交换,代码参考 pipe2 文件

运行结果

wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ gcc pipe2.c -o pipe2.exe
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ ./pipe2.exe
Parent proc output: Who are you? 
Child proc output: Thank you for your message

需要对 read 函数进行把控,容易出现问题。接下来介绍第二种方案。

两个进程通过两个管道进行双向数据交换,代码参考 pipe3 文件

运行结果

wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ gcc pipe3.c -o pipe3.exe
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ ./pipe3.exe
Parent proc output: Who are you? 
Child proc output: Thank you for your message

11.2 运用进程间通信

11.2.1 保存消息的回声服务器端

扩展第 10 章的 echo_mpserv.c 代码,添加如下功能:

将回声客户端传输的字符串按序保存到文件中

要求将该任务委托给另外的进程。代码参考 echo_storeserv.c 文件,客户端代码使用第 10 章的 echo_mpclient.c

运行结果

# 回声服务器端结果,其中客户端输入 1 2 3 4 5。
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ gcc echo_storeserv.c -o serv.exe
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ ./serv.exe 9190
new client connected...
removed proc id: 76693 
client disconnected...
removed proc id: 76710 
^C
wzy@wzypc:~/TCP-IP-NetworkNote/chapter-11$ cat echomsg.out 
1
2
3
4
5

11.2.2 如果想构建更大型的程序

以后要说明的另外两种模型在功能上更加强大,更容易实现我们的想法。

11.3 习题

以下是我的理解,详细题目参照原书

  1. 什么是进程间通信?分别从概念上和内存的角度进行说明。

进程间通信,可以时两个进程通过操作系统提供的方式进行数据通信。

内存上,两个进程通过操作系统提供的内存空间进行通信。

  1. 进程间通信需要特殊的 IPC 机制,这是由操作系统提供的。进程间通信时为何需要操作系统的帮助?

进程之间没有共用内存,难以通信,需要操作系统提供类似共用内存的功能,如『管道』

  1. 管道是典型的 IPC 技法。关于管道,请回答以下问题

Q:管道是进程间交换数据的路径。如何创建此路径?由谁创建?

A:使用 pipe 函数创建,由操作系统创建。

Q:为了完成进程间通信。2 个进程需要同时连接管道。那 2 个进程如何连接到同一管道?

A:文件描述符指向管道,fork 时只复制文件描述符,不复制管道,可以通过文件描述符访问同一管道。

Q:管道允许进行 2 个进程间的双向通信。双向通信中需要注意哪些内容?

A:如果是一个管道进行双向通信,注意函数调用的时机,传入管道的数据,两个进程都可以进行读取。

  1. 编写示例复习 IPC 技法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值