进程间的通讯-----管道

进程间的通讯:两个以上的进程相互传递数据

管道就是进程通讯方式的一种。管道分为有名管道和无名管道

管道:
在进程之间建立数据传输的桥梁, 已完成数据的流通。
注意: 管道是一种半双工通讯
<一>有名管道

概念:有名管道在磁盘上会占据一个 inode 节点, 但是不开辟 block。 有名管道会有一个文件名。
有名管道的操作:创建有名管道文件:
1、 mkfifo 命令创建管道文件
2、 在程序中调用 mkfifo()函数创建管道文件。
通过对文件的操作(open,write ,read,close)来操作管道文件进而达到进程间数据的流通

有名管道的原理:在磁盘上创建一个inode节点,但是不开辟block,有名管道会有一个文件名,两个进程之间通过打开同一个管道文件实现进程通讯,有名管道是一种特殊的文件,存在于文件系统中

管道

有名管道的代码操作如图:A 进程负责接受用户输入的数据, B 进程将用户输入的数据存储到普通文件 a.txt 中
1:有名管道写端(A进程)

管道代码

2:有名管道读端(B进程)

管道代码2

<二>无名管道  

 概念:无名管道并不会创建管道文件, 所以, 无名管道只能应用于父子进程之间。 因为父子进程之间对于 fork 之前打开的文件描述符是共享的。
无名管道的操作:int pipe(int fd[2]); 用于创建并打开一个无名管道, 并且使 fd[0]指向管道的读端, fd[1]指向管道的写端
读无名管道中的数据: read(fds[0], ...);
给无名管道中写数据: write(fds[1], ...);
关闭无名管道: close(fds[0]); close(fds[1]);(由于管道是半双工通讯,所以父子进程只能打开读端或写端,因此必须关闭掉不用打开的一端)
无名管道的原理如图                            

管道

无名管道的代码操作:父进程接受用户数据的数据, 子进程则将用户数据的字符串逆序打印。

无名管道

猜你喜欢

转载自blog.csdn.net/weixin_41537785/article/details/81166238