用管道连接进程
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]`。
也就是说,子进程写进管道的数据将有父进程的标准输入读取。
网友评论