我正在使用以下java代码在C程序的stdin中写入,该程序基本上从stdin读取将A_A_A添加到行的末尾并将其写回到java程序所从的stdout中并抛出stdout < / p>
BufferedWriter b_stdout = new BufferedWriter(new OutputStreamWriter(fuse.process.getOutputStream()));
String strLine;
BufferedReader br = new BufferedReader(new FileReader("/home/Desktop/data1024.dat"));
while ((strLine=br.readLine())!=null)
{
b_stdout.newLine();
b_stdout.write(strLine);
b_stdout.flush();
}
data1024文件是大小为1 MB的文本文件。以上是一个在C程序中写入的线程...... 以下是C程序
main() {
int rc;
int df;
int i;
char buf[32768];
rc = fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
FILE *fp;
for (i=0;i<=10000000;i++)
{
int rc=-1;
memset(buf,'\0',32768);
//rc = fread(buf,5, 1, stdin);
rc = read(fileno(stdin),buf,32768);
if (rc > 0)
{
strcat(buf,"B_B_B_B_B_B_B_B_B");
write(fileno(stdout),buf,strlen(buf));
/*fp=fopen("wroteExeB","a");
fprintf(fp,"%s",buf);
fclose(fp);*/
//printf("%s",buf);
}
}
另一个java线程从此C程序的stdout读取,该程序正在跟随
public void run(){
try{
String strLine;
int c;
BufferedReader bill_stdout = new BufferedReader(new InputStreamReader(fuse.process.getInputStream()));
BufferedWriter new_write = new BufferedWriter(new FileWriter("/homeDesktop/data89.dat"));
while ((strLine = bill_stdout.readLine()) != null) {
new_write.newLine();
new_write.write(strLine);
System.out.println("output thread "+strLine);
new_write.flush();
}
现在我运行程序
我一直面临破碎:管道错误
我可以在C程序中写一些行,因为我可以在输入程序的stdout中看到它们。
某些行是输出线程输出的一部分,但是在17或18之类的几行之后写入C程序的输入线程会出现以下错误
java.io.IOException: Broken pipe
有人可以帮忙解决这个问题......我曾尝试使用 FileWriter 一次编写一个字符,而不是使用 BufferedWriter ,在这种情况下它可以工作并继续写字符
我试图减少写入的输入行的大小...我试图停止输入线程,以便管道可能在它们已满并且数据未被读取时中断。但没有任何作用
请帮助一下。 谢谢
答案 0 :(得分:1)
我没有详细查看代码,但C代码是否将stdin设置为非阻塞?难道不会让C程序立即退出,当你试图写入它时会导致管道损坏吗?
答案 1 :(得分:0)
'断管'表示您已写入另一端已关闭的管道。换句话说,您违反了您和接收方之间的应用程序协议。这不仅仅是缓冲,阻塞/非阻塞模式等问题,而是设计错误。