无名管道间父进程与子进程间的通信(含管道基本概念与特点)

管道

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;
}

结果如下:二者结果相同

  • 22
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值