美文网首页
Head First C学习之管道、pipe()

Head First C学习之管道、pipe()

作者: 燚随风 | 来源:发表于2016-04-07 11:01 被阅读75次

    管道连接进程

    ps -ef |grep init
    
    • 管道两侧的命令实际把它们当成父子进程来连接。
    • 父进程grep用管道把子进程ps的输出连接到自己的输入。

    pipe()打开两条数据流

    #include<unistd.h> //头文件
    int pipe(int filedes[2]);//定义函数
    /*
     函数说明:pipe()会建立管道,并将文件描述词由参数filedes数组返回。
     filedes[0]为管道里的读取端
     filedes[1]则为管道的写入端。
     返回值:若成功则返回零,否则返回-1,错误原因存于errno中。
    */
    

    当用pipe()创建管道时,他会创建两条相连的数据流,并把它加入表中。

    #include <unistd.h>
    ... ...
    int fd[]
    if(pipe(fd) == -1){
    error("Can't create the pipe");
    }
    
    文件描述符 数据流
    0 标准输入
    1 标准输出
    2 标准错误
    3 管道读取端:fd[0]
    4 管道写入端:fd[1]

    fd[1]写管道;fd[0]读管道。

    在子进程中

    close(fd[0]);
    dup2(fd[1],1);
    
    文件描述符 数据流
    0 标准输入
    1 标准输出(管道写入端:fd[1])
    2 标准错误
    3 管道读取端:fd[0]
    4 管道写入端:fd[1]
    • 子进程关闭管道的读取端,管道不会从管道中读取数据。
    • 子进程把管道的写入连接到标准输出。

    也就是说,子进程把发送给标准输出的数据都会写到管道中

    在父进程中

    dup2(fd[0],0);
    close(fd[1]);
    
    文件描述符 数据流
    0 标准输入(管道读取端:fd[0])
    1 标准输出
    2 标准错误
    3 管道读取端:fd[0]
    4 管道写入端:fd[1]
    • 父进程把读取端fd[0]连接到标准输入。关闭管道的写入端fd[1]`。

    也就是说,子进程写进管道的数据将有父进程的标准输入读取。

    相关文章

      网友评论

          本文标题:Head First C学习之管道、pipe()

          本文链接:https://www.haomeiwen.com/subject/bfimlttx.html