作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!
参考链接
http://www.cnblogs.com/vamei/archive/2012/09/14/2683756.html
http://www.cnblogs.com/vamei/archive/2012/10/10/2715398.html
文本流原理
万物皆文本 -> 万物皆文本流
当unix执行一个程序的时候,会自动打开三个流,stdin、stdout、stderr。
默认情况下,stdin连接到键盘,stdout和stderr连接到屏幕。
虽然都打开,但不都一定使用。
文本流例子
键盘敲击("ls\n")的stdin,流入到命令行(命令行也是个程序),
命令行调用/bin/ls得到输出流("a.txt"),
输出流流向屏幕。
重定向
将自定义内容导向stdout -> echo
重定向stdout -> 使用‘>‘或‘>>‘
重定向stdin -> 使用‘<‘
重定向stderr -> 使用‘2>‘或‘2>>‘
重定向stdout和stderr -> 使用‘>&‘
重定向举例
cat < a.txt > b.txt # 把a.txt的内容复制到了b.txt
管道
将一个命令的输出导向另一个命令的输入
利用管道将多个进程连接在一起,从而让各个进程协作,实现复杂的功能。
管道理解
管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个小纸条。
管道的一端连接一个进程的输入,另一端连接另一个进程的输入。
管道不需要很大,他被设计成环形的数据的数据结构,以便可以循环利用。
管道中没有信息的话,从管道中读取的进程会等待。
管道中放满信息的时候,尝试放入信息的进程会等待。
两个进程都终结的时候,管道自动消失
管道原理
管道利用fork机制建立,从而让两个进程可以连接到同一个PIPE上。
开始的时候,管道的输入与输入都连接到同一个进程process1上,
当fork复制进程时,会将这两个连接都复制到新的进程process2上,
随后,两个进程各自关闭掉自己不需要的一个连接,就构成了连接两个进程的PIPE
FIFO
http://blog.csdn.net/lianghe_work/article/details/47722175
由于管道基于fork机制建立,所以管道只能应用于父子进程之间,或者拥有相同祖先的两个子进程之间。为了解决这个问题,linux提供FIFO方式建立连接。
FIFO又叫做命名管道
FIFO是一种特殊的文件类型,他在文件系统中有对应的路径,但是它是由内核管理的。
当一个进程以读的方式打开该文件,另一个进程以写的方式打开该文件,那么内核就会在这两个进程之间建立管道,
FIFO是一个在文件系统中的文件,但是他的内容放在内存中。
使用FIFO的进程退出后,FIFO文件依旧存在在文件系统中
FIFO有名字,不相关的进程可以通过打开命名管道进行通信