无名管道

无名管道 anonymous pipe

无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。

单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。


  1. #include<stdio.h>
  2. #include<sys/types.h>
  3. #include<sys/stat.h>
  4. #include<fcntl.h>
  5. #include<unistd.h>
  6. #include<stdlib.h>

  7. int main(char argc,char *argv[])
  8. {
  9. if(argc<3)
  10. {
  11. printf("请输入三个文件名\n");
  12. return -1;
  13. }
  14. //打开被复制的文件
  15. int i,j;
  16. if(0>(i = open(argv[1],O_RDONLY)))
  17. {
  18. perror("open 1");
  19. return -1;
  20. }
  21. //打开要复制的文件
  22. if(0>(j = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0777)))
  23. {
  24. perror("open 2");
  25. return -1;
  26. }
  27. //创建无名管道
  28. int fd[2]; //管道读写文件描述符
  29. if(0 !=pipe(fd))
  30. {
  31. perror("pipe");
  32. exit(-1);
  33. }
  34. char buf[100];
  35. //创建父子进程
  36. pid_t pid;
  37. if(0>(pid=fork()))
  38. {
  39. perror("fork");
  40. exit(-1);
  41. }
  42. //子进程中将管道内容读入文件
  43. else if(pid == 0)
  44. {
  45. int q;
  46. close(fd[1]);
  47. //从管道中将内容读到数组中
  48. while(1){
  49. if(0>(q=read(fd[0],buf,sizeof(buf))))
  50. {
  51. perror("read");
  52. exit(-1);
  53. }
  54. else if(q==0)
  55. {
  56. printf("read end1\n");
  57. close(fd[0]);
  58. return 0;
  59. }
  60. //从数组中将内容写入文件
  61. if(0>write(j, buf, q))
  62. {
  63. perror("write");
  64. return 0;
  65. }
  66. }
  67. }
  68. //父进程中将文件内容写入管道
  69. {
  70. int p;
  71. close(fd[0]);
  72. //将文件内容读入数组中
  73. while(1){
  74. if(0>(p=read(i,buf,sizeof(buf))))
  75. {
  76. perror("read");
  77. exit(-1);
  78. }
  79. else if(p==0)
  80. {
  81. printf("read end\n");
  82. close(fd[1]);
  83. return 0;
  84. }
  85. //从数组中将内容写入管道
  86. if(0>write(fd[1],buf, p))
  87. {
  88. perror("write");
  89. return 0;
  90. }
  91. }
  92. }
  93. }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值