当前位置:  技术问答>linux和unix

请教:这个bug怎么解决。非常感谢!!!

    来源: 互联网  发布时间:2016-04-25

    本文导语:  #include  #include  #define oops(m,x)  {perror(m); exit(x);} main() { int pid,todc[2],fromdc[2]; //make two pipes if(pipe(todc)==-1||pipe(fromdc)==-1) oops("get pipe failed.",1); //get a process for user interface if((pid=fork())==-1) oops("fork failed ",2); ...

#include 
#include 
#define oops(m,x)  {perror(m); exit(x);}

main()
{
int pid,todc[2],fromdc[2];
//make two pipes
if(pipe(todc)==-1||pipe(fromdc)==-1)
oops("get pipe failed.",1);
//get a process for user interface
if((pid=fork())==-1)
oops("fork failed ",2);

if(pid==0)           //child is dc
be_dc(todc,fromdc);
else{                 //parent is ui 
 
be_bc(todc,fromdc); 
wait(NULL); //wait for child
}
}

void be_dc(int in[2],int out[2])
{
close(in[1]);
close(out[0]);

if(dup2(in[0],0)==-1) //copy read end to 0
oops("dc:cannot redirect stdin ",3);
close(in[0]);  //moved to fd 0
 
if(dup2(out[1],1)==-1) //dupe write end to 1
oops("dc:cannot redirect stdout",4);
close(out[1]); //moved to 1

execlp("dc","dc","-",NULL);
oops("cannot run dc",5);
}

void be_bc(int todc[2],int fromdc[2])
//从stdin读,然后转换成RPN,传送给pipe,然后
//从其他管道读入,并打印出


{

int num1,num2;
char operation[BUFSIZ],*fgets();
char message[BUFSIZ];
FILE *fpout ,*fpin;
int n_read;
close(todc[0]);
close(fromdc[1]);

fpout=fdopen(todc[1],"w");
fpin=fdopen(fromdc[0],"r");
if(fpout==NULL||fpin==NULL)
fatal("Error convering pipes to streams");
//main loop
while(printf("tinybc:"),fgets(message,BUFSIZ,stdin)!=NULL)
{
if(sscanf(message,"%d%[+-*/^]%d",&num1,operation,&num2)!=3)
{printf("syntax errorn");
continue;
}

if(fprintf(fpout,"%dn%dn%cnpn",num1,num2,*operation)==EOF)
fatal("Error writing");
fflush(fpout);

if(fgets(message,BUFSIZ,fpin)==NULL)
break;
printf("%d%c%d=%s",num1,*operation,num2,message);
/*
这里有个小 bug,当我的执行完一个运算的时候,不能跳出继续另一个运算,这是怎么回事阿?
我觉得问题就在这个while语句中。请高人指点。。。
*/


while(fgets(message,BUFSIZ,fpin)!=NULL)
{
printf("%s",message);
}
}
fclose(fpout);
fclose(fpin);

}

fatal(char *mess[])
{
fprintf(stderr,"Error :%sn",mess);
exit(1);
}

//这个程序有bug,当两个操作数的结果大于4096个字节时,一次打印不出全部结果,管道此时阻塞,下一次再执行计算的时候不能得出正确结果。
//所以我在程序上加入了一个while语句,希望把管道的内容全部打印出来,但是发现程序跳不出来了,不能再次计算了,请问这是什么原因。(while语句见我的注视。

|
管道有个缓存大小,你一定写超过4096的时候一次就写不全了,所以你一次读也就不能读出全部的结果了。

你循环读的时候需要判断要读多长的数据,因为管道本身的读写都没有界定数据边界的机制,你必须自己知道要读多长数据,或是根据读到的内容判断是否已经收完了本次数据。

    
 
 

您可能感兴趣的文章:

  • 急切请教一个关于makefile的问题,万分感谢。
  • 请教s3c2410-UART2以DMA方式进行数据读取的驱动中问题,感谢
  • 请教代码出错,偶是菜鸟,感谢赐教
  • 各位大虾,请教装了REDHAT9操作系统后,启动时无法引导到LINUX,请教该如何解决啊
  • :请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教高手,小弟打印width=1500,height=600(A3纸)的Applet,在预览中是该区域是黑的,打印出来也是黑的,请教高手解决一下
  • 请教:用jbuilder7编写程序时,光标显示不正确,请问怎样解决?
  • 请教高手:cpu占用经常100%怎么解决?
  • 请教:关于英文,简体中文,繁体中文在JSP/JAVA中的整体解决方案!!!
  • 请教各位大虾们,我的忧愁你能解决!
  • 请教高手:解决Runtime类的traceMethodCalls(boolean)的问题???
  • telnet失败,请教原因及解决办法
  • 请教一个简单问题,解决马上结贴送分
  • 请教各位大侠,这个问题该如何解决???
  • 问题还是没有解决,请教
  • 请教高手,linux下使用libusb_submit_transfer,返回-1,errno = 16,如何解决?
  • [RedHat9]RedHat9无法进入图形模式,疑是声卡问题,请教如何解决?
  • 菜鸟问题: 请教网络浏览器占用大量资源的解决办法
  • 请教高手:在基于Java的三层分布式结构应用中的打印的解决方案(套打)
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教 iis7站长之家
  • 请教,在向Ultraedit里面拷贝文本时,中文显示为??,应该如何解决?
  • g++ 编译出现:undefined reference to 'main'错误,请教如何解决?
  • 高分请教:我用linux作网关,但我在内网不能连接外网的vpn(具体情况见帖),请问如何解决!谢谢
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请教,请教,这个问题是为什么????
  • 请教本地硬盘安装问题请教本地硬盘安装问题
  • ■请教■请教redhat最基本的问题!
  • 请教一个 shell 问题,我用下面这个 shell 语句总是失败,请教
  • 高分请教,各位大侠,请教一个问题,理论高手请进??谢谢
  • 请教Linux下pgadmin3-1.0.2的编译和安装!!高分请教!
  • 请教,请教,,,一定要看!!一定要看!!
  • 请教象我这样的硬盘应如何安装Linux,我昨天试装了,但有问题。(老问题了,也看了前面的帖子,但还是来请教,请多指教)
  • 请教这种循环的执行过程
  • 请教两个redhat9问题
  • 请教如何在指定目录下查找包含指定文字的文件
  • 请教局域网中如何通过ip地址得到主机名
  • 请教kdevelop的问题
  • 请教linux 下的adsl拨号问题.
  • 请教,如何用虚拟订机安装liux
  • 【请教】LINUX 下SNMP的MIB开发
  • 请教一个opengl的问题
  • 请教unix常用命令命令问题
  • 请教两个shell
  • 请教高手:如何用gnome/gtk编写托盘程序


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3