管道
1.管道概念
2.本质
- 内核缓冲区
- 伪文件-不会占用磁盘空间
3.特点
两部分:
- 读端,写端,对应两个文件描述符
- 数据写端流入,读端流出
- 操作管理的进程被摧毁后,管道自动被释放
- 管道默认是阻塞的
4.管道的原理
- 内部实现方式:队列
- 环形队列:先进先出
缓冲区大小
- 默认为4k
- 大小会根据实际情况做出调整
5.管道的局限性
- 队列:数据只能读一次,不能重复读取
- 半双工通信
6.创建无名管道
7.父子进程通信实现ps aux
代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int ret;
int fd[2];
ret = pipe(fd);//创建无名通道
if(ret == -1)
{
printf("create pipe failed !\n");
exit(1);
}
pid_t pid = fork();//创建父子进程
if(pid == -1)//创建进程失败
{
printf("fork failed!\n");
exit(1);
}
//ps aux
if(pid>0) //父进程
{
close(fd[0]); //关闭读功能
dup2(fd[1],STDOUT_FILENO);//由于execlp为执行括号中的程序,会打印在终端,因此我们需要dup2函数来进行重新定向
execlp("ps","ps","aux",NULL);
perror("execlp");
exit(1);
}
//grep "bush"
else if(pid == 0) //子进程
{
close(fd[1]);//关闭写的功能
dup2(fd[0],STDIN_FILENO);//同上
execlp("grep","grep","--color=auto","bush",NULL);
}
printf("pipe[0] is %d\n",fd[0]);
printf("pipe[1] is %d\n",fd[1]);
close(fd[0]);
close(fd[1]);
return 0;
}
结果如下:二者结果相同