CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

谁帮我看看这样重定向标准输入输出,通过管道有什么错呀?

楼主aqhlwwx()2006-03-10 13:27:20 在 Linux/Unix社区 / 程序开发区 提问

目的是在实现类似SHELL中的   |   管道符号的功能,比如将|符号前面程序的输出作为后面程序的输入  
  我使用管道描述符和dup2函数重定向前面程序的标准输出到管道,后面程序的标准输入从管道读,有哪里不对亚?  
  现在如果执行more   test.c   |   grep   "s"则什么都没有输出(test.c里有字符s的),如果执行cal   |   ls则只输出ls的内容  
   
  为什么阿?  
   
  if   (pipe(fd)   <   0)  
  err_sys("pipe   error");  
   
  if   (   (pid   =   fork())   <   0)  
  err_sys("fork   error");  
  else   if   (pid   >   0)  
  {  
  close(fd[0]); //   前面的程序关闭读端  
  if(dup2(fd[1],STDOUT_FILENO)   ==   -1) //   前面的程序重定向标准输出到管道  
  err_sys("dup2   error");  
  //close(fd[1]);  
  execvp(command[0][0],   command[0]);  
  err_ret("couldn't   execute:   %s",   buf);  
  exit(127);  
  }  
  close(fd[1]); //   后面的程序关闭写端  
  if(dup2(fd[0],STDIN_FILENO)   ==   -1) //   后面的程序重定向标准输入从管道  
  err_sys("dup2   error");  
  //close(fd[0]);  
  execvp(command[1][0],   command[1]);  
  err_ret("couldn't   execute:   %s",   buf);  
  exit(127); 问题点数:50、回复次数:8Top

1 楼fierygnu(va_list)回复于 2006-03-10 14:29:40 得分 0

这样只能父子进程间通信。你要实现的是什么?是shell?Top

2 楼lanying(蓝鹰)(问个不休)回复于 2006-03-10 19:37:53 得分 0

关注一下Top

3 楼victor03(dullboy)回复于 2006-03-10 19:58:13 得分 0

你写的dup2错了:    
          int   dup2(int   file_descriptor_one,int   file_descriptor_two);  
  dup2创建的新文件描述符或者与file_descriptor_two相同,或者是第一个大于file_descriptor_two的可用值。所以在调用dup2时必须先调用:  
          close(STDOUT_FILENO);  
  才能将其重定向到STDOUT_FILENO.(下面的也一样)  
   
  Top

4 楼phus(phus)回复于 2006-03-10 21:11:52 得分 50

楼上的是以己昏昏,使人昭昭.Top

5 楼fierygnu(va_list)回复于 2006-03-10 22:05:13 得分 0

:)Top

6 楼aqhlwwx()回复于 2006-03-10 22:53:00 得分 0

是实现Shell呀。。。  
  父进程输出到子进程吧...  
  类似于more   test.c   |   grep   "s"这种的Top

7 楼aqhlwwx()回复于 2006-03-11 00:40:46 得分 0

for   (i=0;i<pipeLevel;i++)  
  {  
   
  if   (pipe(fd[i])   ==   -1)    
              err_sys("pipe   error");  
   
  }  
   
   
  for   (j=0;j<pipeLevel;j++)  
  {  
  if   (j   !=   0)  
   
  pipe_in   =   fd[j-1][0];  
   
  else    
  pipe_in   =   -1;  
   
   
  if   (j   !=   pipeLevel-1)  
   
  pipe_out   =   fd[j][1];  
   
  else    
   
  pipe_out   =   -1;  
   
  if   (   (pid   =   fork())   <   0)  
  err_sys("fork   error");  
  else   if   (pid   ==   0)  
  {  
  if   (bg   <=   0)  
  {  
  if   (pipe_in   ==   -1)  
   
  close(pipe_in);  
   
  if   (pipe_out   ==   -1)  
   
  close(pipe_out);  
   
   
   
  if   (pipe_out   !=   -1)    
  {  
   
  dup2(pipe_out,1);  
   
  close(pipe_out);  
   
                  }  
   
  if   (pipe_in   !=   -1)    
  {  
   
  dup2(pipe_in,0);  
   
  close(pipe_in);  
   
  }  
  execvp(command[j][0],   command[j]);  
  err_ret("couldn't   execute:   %s",   buf);  
  exit(127);  
  }  
  //   父进程等待子进程结束  
  if   (   (pid   =   waitpid(pid,   &status,   0))   <   0)  
  err_sys("waitpid   error");  
  close(pipe_in);  
   
  close(pipe_out);  
   
  ....  
   
  这样还是不行!  
  more   test.c   |   grep   "s"  
  还是什么都显示不出!Top

8 楼fierygnu(va_list)回复于 2006-03-11 19:50:34 得分 0

execvp执行的什么?Top

相关问题

  • 控制台输入输出重定向的问题?
  • [结论]如何对CMD窗口进行输入输出重定向
  • 输出重定向问题
  • gcc程序怎么不能将输出重定向到文件或管道呀,你们有这个问题吗?
  • 急救!!!(关于子进程重定向输入,输出的问题)……静待高手
  • [难题] 如何通过输入输出重定向,来使用telnet或者ftp?例如在wSpawn里。
  • 如何将标准输出重定向
  • Creatprocess输出重定向的问题
  • 高分请教如何将一个纯DOS程序的输入和输出重定向到一个WIN窗口中
  • 高分请教如何将一个纯DOS程序的输入和输出重定向到一个WIN窗口中

关键词

  • 重定向
  • 管道
  • dup2
  • 输出
  • 程序
  • fileno
  • 标准
  • fd
  • descriptor
  • 进程

得分解答快速导航

  • 帖主:aqhlwwx
  • phus

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo