Linux pipe学习


pipe用于在具有血缘关系的进程之间的通信。
pipe单独构成一种独立的文件系统,对于管道两端的进程而言,它就是一个文件,但它不是普通的文件;
管道不属于现有的某个文件系统,它单独构成一种文件系统,存在于内存中;
除了对具有血缘关系的进程外,管道对于其它的进程是不可见的。

使用pipe系统调用可以用来创建一个管道,
#include <unistd.h>

int pipe(int pipefd[2]);
其中pipefd[0]是读数据端,pipefd[1]是写数据端。

所谓半双工,就是在一段时间内,数据只能从一端到另一端传输;
所谓全双工,就是同一个时间既允许读、也允许写。
所以,pipe和FIFO都是属于半双工通信。

如果需要从pipe读数据,需要先将写数据描述符关掉;
如果要向pipe写数据,需要先将读数据描述符关掉。

ls | more,它是将ls的标准输出透过管道作为more程序的标准输入。
它和使用临时文件的方法:ls > temp; more < temp;
类似,但是相比于临时文件的方法,使用管道具有更高的程序效率。

ls | more的执行过程:
1. 调用pipe系统调用创建管道;
2. 调用fork系统创建两个进程用来装载管道两边的程序;
#include <unistd.h>

pid_t fork(void);
3. close管道左边的读数据描述符和管道右边的写数据描述符;
#include <unistd.h>

int close(int fd);
4. 其中一个进程执行ls程序,它会先
dup2(writefd, stdout);
将标准输出stdout重定向到writefd。
这样执行ls程序的标准输出结果就会被重定向到writefd;
5. 另外一个进程用来执行more程序,它会先
dup2(readfd, stdin);
将标准输出重定向到readfd。
这样execve()执行/bin/more时就会默认从stdin读数据。
#include <unistd.h>

int dup2(int oldfd, int newfd);
dup2系统调用在重定向进程的stdin、stdout和stderr时非常有用。

相关内容

    暂无相关文章