美文网首页
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