Broken Pipe Java程序在外部C程序stdin中编写并从stdout读取

时间:2011-05-31 19:24:46

标签: java process stdin outputstream filewriter

我正在使用以下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 ,在这种情况下它可以工作并继续写字符

我试图减少写入的输入行的大小...我试图停止输入线程,以便管道可能在它们已满并且数据未被读取时中断。但没有任何作用

请帮助一下。 谢谢

2 个答案:

答案 0 :(得分:1)

我没有详细查看代码,但C代码是否将stdin设置为非阻塞?难道不会让C程序立即退出,当你试图写入它时会导致管道损坏吗?

答案 1 :(得分:0)

'断管'表示您已写入另一端已关闭的管道。换句话说,您违反了您和接收方之间的应用程序协议。这不仅仅是缓冲,阻塞/非阻塞模式等问题,而是设计错误。