- 论坛徽章:
- 0
|
5可用积分
我之前提过一个问题(http://bbs.chinaunix.net/thread-1776837-1-1.html),这个不涉及文件IO的类似程序,总能正常运行。
但是现在我加入了文件IO,有时候能正常运行,有时候出现Broker pipe. 不知道是为什么
还请各位高人继续指教啊。
-------------------------------------------------------------------------------
建立一个命令行程序,做加法
> cat calc.C
#include<iostream.h>
int main(void){
int a , b;
while(cin>>a>>b){
cout<<a+b<<'\n';
}
return 0;
}
编译得到calc.
>cat in.txt
20 30
5 6
然后用一个管道程序my,它读取in.txt,通过管道发送给calc作为stdin,读取calc的stdout,并写入到文件out.txt。后面是源代码。
------------------------------------------------------------------------------
很奇怪,执行a.out的时候,有时候能成功,也就是out.txt的内容是
50
11
有时候执行a.out就只有一个数字
50
有时候执行a.out,出现Broker pipe错误。
这是为什么?
>cat my.C
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(void){
int p2my[2];
int my2p[2];
char bufin[128]={0};
char bufout[128]={0};
if(pipe(p2my) || pipe(my2p)){
printf("pipe failed\n");
exit(1);
}
int pid=fork();
if(pid<0){
printf("fork failed\n");
exit(1);
}
if(pid>0){//father
close(p2my[0]);
close(my2p[1]);
int fdin=open("in.txt",O_RDONLY);
int fdout=open("out.txt",O_RDWR|O_CREAT,O_NONBLOCK);
int i,r=0;
do{
for(i=0;i<128;++i){bufin[ i ]=0;bufout[ i ]=0;}
r=read(fdin,bufin,sizeof(bufin));
write(p2my[1],bufin,sizeof(bufin));
read( my2p[0],bufout,sizeof(bufout));
write(fdout, bufout,sizeof(bufout));
}while(r!=0);
close(fdin);
close(fdout);
}else if(pid==0){//child
close(p2my[1]);
close(my2p[0]);
close(0);
close(1);
dup2(p2my[0],0);
dup2(my2p[1],1);
execl("my",NULL);
}
return 0;
} |
最佳答案
查看完整内容
回复 1# kgisme170 子进程execl程序,应该是还没启动起来,就往管道中输出内容了吧?你可以试一下这个解决办法:fork后,在主程序中休眠1s。
|