UNIX系统在OS的发展上,最重要的贡献之一便是该系统首创了管道(pipe)。这也是UNIX系统的一大特色。 所谓管道,是指能够连接一个写进程和一个读进程的,并允许它们以生产者—消费者方式进行通信的一个共享文件,又称为pipe文件。由写进程从管道的写入端(句柄1)将数据写入管道,而读进程则从管道的读出端(句柄0)读出数据。 管道有两种使用方式:命令行方式和程序方式。
通信(命令行)
输入重定向 ( < )
输出重定向 ( > )
管道符 ( | )
通信(程序)
文件描述符:
一般来说,输入默认是键盘输入,输出和报错默认为显示器输出。
管道的概念:
管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。
管道只能用于父子进程或者兄弟进程之间(具有“亲缘”关系的进程);
管道单独构成一种独立的文件系统:管道对于管道两端的进程而言就是一个文件,但它不是普通的文件, 它不属于某种文件系统,而是自立门户,并且只存在于内存中。
pipe()(创建管道)
创建一个管道,fd[1]
是管道写入端,fd[0]
是管道读出端。
成功返回 0,失败返回 -1
dup2()
把oldfd文件描述符复制到targetfd,使oldfd和targetfd指向同一文件。
open()
打开指定的文件,返回文件描述符。
pathname:欲打开的文件路径字符串
flags:
-
O_RDONLY
以只读方式打开文件 -
O_WRONLY
以只写方式打开文件 -
O_RDWR
以可读写方式打开文件 -
O_CREAT
若欲打开的文件不存在则自动建立该文件 -
O_TRUNC
若文件存在并且以可写的方式打开时, 令文件长度清为0,即清除以前的内容
mode:文件权限
close()
关闭指定文件描述符的文件。
read()
从fd所指示的文件中读出nbyte个字节的数据,并将它们送至由指针buffer所指示的缓冲区中
write()
把 nbyte 个字节的数据,从 buffer 所指向的缓冲区写到由fd所指向的文件中。