2、管道(无名管道):

       a、只能用于具有亲缘关系的进程之间通信;

       b、半双工模式,具有固定的读端和写端;

       c、管道不是普通文件,不属于任何文件系统,只存在于内存中;

       d、当一个管道通过函数 int pipe(int fd[2]) 创建时,fd[0] 为固定的读端,fd[1] 为固定的写端;

       e、对管道的读写,其实就是对内核缓冲区的读写;

       注意:

       I、 如果所有指向该管道读端的文件描述符都已经关闭,而写端继续写,则会收到SIGPIPE信号,通常会导致进程异常终止;

       II、 如果所有指向该管道写端的文件描述符都已经关闭,而读端继续读,则读端会继续读取完毕管道中的内容,读完后再次读取的时候,就会返回0 ,就像读到文件末尾一样;

       III、如果指向该管道的文件的读端和写端都没有关闭,但是写端没有向管道中写入数据,这时,读端会继续读取管道中剩余的数据,读取完毕后,阻塞等待,直到管道中再有数据;

       IIII、如果指向该管道的读端和写端都没有关闭,但是读端不读取任何数据,而写端不断写入数据,当管道被写满时,就会阻塞等待;


3、标准流管道:

     带有缓冲区

      函数: FILE* popen(char* command ,char* type);

                   int       pclose(FILE* stream);

     command 指的是路径+文件名;

     type表示的是读写方式,只能是其中一种方式,不能读写同时进行,当参数是两个时,只取第一个的值;


     wait4()被 pclose(FILE* stream)调用,等待管道进程运行结束,然后关闭文件流;