进程间通信概念:(IPC)

    每个进程都有各自不同的进程地址空间,任何一个进程的全局变量在另一个进程中都看不到,因此进程之间要交换数据必须要通过内核,在内核中开辟一块缓冲区,进程把数据从用户空间拷贝到内核区,再从内核缓冲区取出数据。这就叫进程间的通信。

wKioL1cKG-2BsHvqAAA2_OyJAYk035.png

管道技术:(pipe)

    是一种最基本进程间通信机制,它是基于字节流的。分为匿名管道和命名管道。

调用pipe函数时,会在内核区开辟一块缓冲区用于通信,它有一个读端和一个写端,通过参数传给用户程序两个文件描述符,0指管道的读端,1指管道的写端,因此管道在用户程序看来就像一个打开的文件,向这个文件读写数据,其实就是读写内核缓冲区。

匿名管道特点:单向通信;必须是有血缘关系的进程间通信;管道内部自有机制来保护数据能读写完全;是一种面向流式的服务

wKiom1cItdLRIYc2AABYrs8N4Rc856.png

父进程调pipe开辟管道得到两个文件描述符指向管道两端;用fork创子进程,子进程也有两个文件描述符指向同一管道;父进程关闭管道写端,子进程关闭管道读端。

wKiom1cItijxaQ2uAABBafyVRqk790.png

运行结果:

wKioL1cIt9_hxTfOAAAe1YY-K_E900.png

使用管道时应注意四种特殊情况:

1.指向管道的写端没关闭,但是也不写数据,此时指向管道的读端还一直再读数据,当读完管道的数据后,再次读会阻塞,知道管道中有数据了才读取数据并返回。

wKioL1cIwvfzJjmpAAA5CgXTnSc431.png

如图,当count等于5时,让它停止写入,此时读端会阻塞。

wKioL1cIw42DaZvmAAAgORI56IU689.png

2.指向管道的读端没关闭,但是也不读数据,此时指向管道的写端还一直再写数据,当管道被写满时,再次写会阻塞。知道管道中有空位置了才写。(代码类似1)

3.如果指向管道的写端都关闭了,而指向管道的读端还在读,当剩余数据被读完后,再次读会返回0,好比已经读到文件结尾了。

wKiom1cIxeDzHwKfAAA5mRhSTSY858.png

4..如果指向管道的读端都关闭了,而指向管道的写端还在写,那么此时该进程会收到一个SIGPIPE,使进程异常终止。

命名管道:(FIFO)它可以用于任何两个进程间的通信,不管是否有血缘关系,它是存在于用盘上的文件,在文件系统中以文件名的方式存在,它是一个可见的文件。可以通过文件系统公共路径名来表示一个IPC通道。它按照先进先出原则,第一个被写入的数据总是第一个先被读出来。

写端往文件里里写入数据

wKioL1cKGoehq25pAABQi6XRItY442.png

读端读取数据

wKioL1cKGonjYlpkAABEuIfoELA804.png

运行结果:

wKioL1cKIBWw4w-VAAApsdPtfRs726.png