Skip to content

Latest commit

 

History

History
54 lines (30 loc) · 2.31 KB

10-进程间通信.md

File metadata and controls

54 lines (30 loc) · 2.31 KB

进程间通信

1. 进程间通信的基本概念

进程间通信意味着不同进程间可以交换数据,为了实现这点,操作系统应该能提供两个进程可以同时访问的内存空间;

因为进程具有完全独立的内存结构,通过fork函数创建的子进程也不会与父进程共享内存空间,因此进程间通信只能通过其他特殊方法完成;

1. 通过管道实现进程间通信

image-20210831204212846

为了完成进程间通信,需要创建管道;管道和套接字一样属于操作系统的资源;

#include <unistd.h>
int pipe(int filedes[2]);
  • filedes[0]:通过管道接收数据时使用的文件描述符,即管道出口;
  • filedes[1]:通过管道传输数据时使用的文件描述符,即管道入口;
  • 父进程调用该函数将创建管道,同时获取对应于出入口的文件描述符,此时父进程可以读写同一管道;但父进程的目的是与子进程进行数据交换,因此需要将入口或出口中的一个文件描述符传递给子进程!如何传递呢?

通过调用fork函数实现传递!

image-20210831232956199

实例见Code/pipe1.cpp;

2. 通过管道进行进程间双向通信

image-20210831233832844

实例见Code/pipe3.cpp;

在这个代码里,我们写的很谨慎,就是为了防止错误发生!

只用1个管道进行双向通信并非易事,为了实现这点,程序需要能够预测并控制运行流程,这在每种系统中都不相同,因此被视为不可能完成的任务;那么如何进行正确简单的双向通信呢?

  • 创建2个管道。

image-20210831235935842

实例见Code/pipe3.cpp;

2. 运用进程间通信

保存消息的回声服务器

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

将该任务委托给另外的进程---另外创建进程,从向客户端提供 服务的进程读取字符串信息。

实例见Code/echo_storeserv.cpp;