0

我正在使用以下 java 代码写入 C 程序的标准输入,该程序基本上从标准输入读取,将 A_A_A 添加到行尾,并将其写回到 java 程序从中读取的标准输出中并抛出标准输出

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 程序的标准输出中读取

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();
                }

现在当我运行程序时

我经常面临 Broken:Pipe 错误

我可以在 C 程序中写入一些行,因为我可以在输入程序的标准输出中看到它们。

有些行是输出线程输出的一部分,但是在 C 程序中编写的输入线程在 17 或 18 等几行之后给出以下错误

java.io.IOException: Broken pipe

有人可以帮忙吗...我尝试使用FileWriter一次写入一个字符,而不是使用BufferedWriter在这种情况下它可以工作并继续写入字符。

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

请帮忙。谢谢

4

2 回答 2

1

我没有详细查看代码,但是 C 代码是否将标准输入设置为非阻塞?这不会让 C 程序立即退出,导致当您尝试写入它时导致管道损坏?

于 2011-05-31T21:41:33.233 回答
0

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

于 2011-05-31T23:12:15.367 回答