当前位置:   article > 正文

Linux读写管道

linux读写管道

管道创建成功后分别会返回一个读和写管道描述符,可以用文件操作的相关函数对描述符进行读写。

 

  • 如果管道的写描述符关闭,则读函数返回读出的字节数是0
  • 如果管道的读描述符关闭,写返回错误SIGPIPE
  • 如果管道写入时,管道已经满,写操作被阻塞直到空间存在
  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<stdlib.h>
  4. #include<wait.h>
  5. #include<errno.h>
  6. #include<signal.h>
  7. #include <setjmp.h>
  8. #include<sys/types.h>
  9. #include<fcntl.h>
  10. #include<sys/stat.h>

 

  1. /*首先创建了管道,然后创建子进程,在子进程里面用execlp函数执行ls命令,利用函数dup2
  2. 子进程的标准输出重定向到管道描述符,使得本来应该输出到屏幕的ls命令结果
  1. 输出到了管道的写描述符,而在父进程里面调用execlp函数执行wc命令,同样调用dup2将父
  2. 进程的标准输入重定向由标准输入变成了管道的读描述符,这样父进程执行wc命令时

 

  1. 其输入就是从管道读取的数据,恰好是由子进程执行ls命令输出的数据,巧妙实现了利用管道编程实现了shell功能ls-l|wc-l这个功能*/
  2. <span style="font-family: Arial, Helvetica, sans-serif;">
  3. int main()
  4. </span><span style="font-family: Arial, Helvetica, sans-serif;">{
  5. int pfds[2];//创建数组保存管道返回的文件描述符号</span>
  1. if (pipe(pfds) == 0)
  2. {
  3. if (fork() == 0)//子进程
  4. {
  5. close(1);//等价与STDOUT_FILENO
  6. dup2(pfds[1], 1);//将管道的写文件描述符号复制到进程的标准输出
  7. close(pfds[0]);//关闭管道的读
  8. execlp("ls", "ls","-l", NULL);//执行ls -l命令,将输出写入管道
  9. }
  10. else//父进程
  11. {
  12. close(0);//关闭标准输入
  13. dup2(pfds[0], 0);//将管道的读文件描述服复制到进程的标准输入
  14. close(pfds[1]);//关闭管道的写
  15. execlp("wc", "wc", "-l", NULL);//执行wc -l,将从管道读去的数据作为输出
  16. }
  17. }
  18. return 0;
  19. }

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/212059
推荐阅读
相关标签
  

闽ICP备14008679号