浅谈linux管道

来源:互联网 发布:网络安全法特点 编辑:程序博客网 时间:2024/06/04 01:04

管道的基本概念

管道是一种基本的IPC机制,作用在于使有血缘关系的进程之间完成数据传递。创建管道使用pipe函数,头文件是unistd.h

pipe函数的使用

#include<unistd.h>

int pipe(int filedes[2]);

返回值:成功返回0,否则返回-1。参数为包含两个整形的数组,即两个文件描述符,一个为写端,一个为读端。

管道的特点

1:管道本质为伪文件,是内核中的一个缓冲区

2:通过两个文件描述符来引用,分别对应读端和写端

3:数据从写端流入缓冲区,从读端流出缓冲区

管道的原理

管道实际为内核使用环形队列实现,借助于内核缓冲区

使用管道的四种特殊情况

1:如果所有指向管道的写端的文件描述符都关闭了,但仍有进程从读端读取数据。当管道中的数据被读完时,再次读取会读到0,即管道内数据的结尾字符。

2:如果有指向管道写端的文件描述符没有关闭,但也没有向管道中写入数据。当管道中的数据被读端读完后,再次读取会阻塞,等待写端写入数据。

3:如果所有指向管道读端的文件描述符都关闭了,但仍有进程向管道中写入数据,此时该写进程会收到SIGPIPE信号,导致异常终止。当然,也可以通过信号捕捉,防止写端进程终止。

4:如果有指向管道读端的文件描述符没有关闭,但也没有从管道中读取数据,写端一直向管道中写入数据,当管道中数据写满时,写入进程会阻塞,等读端从管道中读走数据后,继续写入。

实现代码: