无名管道(匿名管道)pipe:
1、它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端
2、只能用于具有亲缘关系的进程间通信(父子进程、兄弟进程等)
3、可以看成是一种特殊的文件,对它的读写也可以使用普通的read、write等函数,但它不是普通的文件,不属于任何文件系统,并且只能存在于内存中。
无名管道的一些特性:
读管道:
管道中有数据,read返回实际读到的字节数。
管道中无数据:
写端被全部关闭,read返回0(相当于读到文件的末尾)
写端没有完全关闭,read阻塞等待
写管道:
管道读端全部被关闭,进程异常终止(进程收到SIGPIPE信号)
管道读端没有全部关闭:
管道已满,write阻塞
管道没有满,write将数据写入,并返回实际写入的字节数
有名管道FIFO:
1、有名管道(FIFO) 不同于匿名管道之处在于它提供了一个路径名与之关联,以FIFO
的文件形式存在于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样
即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此
通过FIFO相互通信,因此,通过FIFO不相关的进程也能交换数据。
2、一旦打开了FIFO, 就能在它.上面使用与操作匿名管道和其他文件的系统调用一样的i/o系统调用了(如read()、 write()和close()) 。与管道一样,FIFO也有一个写入端和读取端,并且从管道中读取数据的顺序与写入的顺序是一样的。
有名管道(FIFO)和匿名管道(pipe) 有一些特点是相同的,不一样的地方在于:
1. FIFO 在文件系统中作为一个特殊文件存在,但FIFO 中的内容却存放在内存中。
2.当使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便以后使用。
3.FIFO有名字,不相关的进程可以通过打开有名管道进行通信。
通过命令创建有名管道:
mkfifo 名字
有名管道的注意事项:
1.一个为只读而打开一个管道的进程会阻塞,直到另外一个进程为只写打开管道
2.一个为只写而打开一个管道的进程会阻塞,直到另外一个进程为只读打开管道
读管道:
管道中有数据,read返回实际读到的字节数
管道中无数据:
管道写端被全部关闭,read返回0,(相当于读到文件末尾)
写端没有全部被关闭,read阻塞等待
写管道:
管道读端被全部关闭,进行异常终止(收到一个SIGPIPE信号)
管道读端没有全部关闭:
管道已经满了,write会阻塞
管道没有满,write将数据写入,并返回实际写入的字节数。