免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5830 | 回复: 4
打印 上一主题 下一主题

[C] 关于Linux管道中read() 和write()的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-21 21:21 |只看该作者 |倒序浏览
代码很简单:
父进程向管道中写入"Hello,World!\n",子进程将管道中的数据读出存储到buf2,然后送到标准输出中。
问题是如果要写入的字符串超过了BUFFER_SIZE,应该怎样编写代码呢?求指点迷津阿

附上代码:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/types.h>
  4. #include <limits.h>
  5. #include <stdlib.h>
  6. #include <string.h>

  7. #define BUFFER_SIZE 100


  8. int main(int argc, char **argv)
  9. {
  10.         int fd[2];
  11.         char buf1[BUFFER_SIZE] = "Hello,World!\n"  ;
  12.     char buf2[BUFFER_SIZE];
  13.         pid_t pid;
  14.         int len;
  15.         if((pipe(fd))<0)
  16.         {
  17.                 printf("pipe failed\n");
  18.         }
  19.         if((pid = fork())<0)
  20.         {
  21.                 printf("fork failed\n");
  22.         }
  23.         else if(pid>0)
  24.         {
  25.                 close(fd[0]);
  26.                 write(fd[1],buf1,strlen(buf1));
  27.                 exit(0);
  28.         }
  29.         else
  30.         {
  31.         wait(2);
  32.                 close(fd[1]);
  33.                 len = read(fd[0],buf2,BUFFER_SIZE);
  34.                 if(len < 0)
  35.                 {
  36.                         printf("process failed when read\n");
  37.                 }
  38.                 else
  39.                 {
  40.                         write(STDOUT_FILENO,buf2,len);
  41.                 }
  42.                 exit(0);
  43.         }
  44.         return 0;
  45. }
复制代码
我想请教一下,如果要写入的数据比BUFFER_SIZE 还要大该怎么实现呢?

论坛徽章:
0
2 [报告]
发表于 2013-10-22 00:25 |只看该作者
1. 请用perror输出错误信息。
2. 没看懂你的意思。你把BUFFER_SIZE改大一点不就行了?只要不比PIPE_BUF大,那么写入pipe的信息就不会和其他向同一个pipe写入的信息混起来。

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
3 [报告]
发表于 2013-10-22 10:13 |只看该作者
回复 1# 373202184
将write放在while循环中,分多次写直到写完
将read也放在while循环中,直到返回0
另外你的wait(2),看一下文档吧(man -s 2 wait)
   

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
4 [报告]
发表于 2013-10-23 06:06 |只看该作者
给你个循环read的例子 http://www.oschina.net/code/snippet_1016509_25659, 循环write类似。

论坛徽章:
0
5 [报告]
发表于 2013-10-23 20:49 |只看该作者
回复 4# fly3ds


    谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP