Запись Java-программ Broken Pipe во внешнем стандартном C-программах и чтение из stdout - PullRequest
0 голосов
/ 31 мая 2011

Я использую следующий java-код для записи в stdin программы на C, которая в основном читает из stdin, добавляет A_A_A в конец строки и записывает его обратно в stdout, с которого java-программа читает, и выбрасывает stdout

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 МБ.Выше приведен поток, который пишет в программе на 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, как я вижу их в stdout входной программы.

Некоторые строки являются частью вывода из выходного потока, но поток ввода, который пишет в программе на C после нескольких строк, таких как 17 или 18, выдает следующую ошибку

java.io.IOException: Broken pipe

Couldкакая-то помощь в этом ... Я пытался писать по одному символу за раз, используя FileWriter и не используя BufferedWriter , в этом случае он работает и продолжает писать символы.

Я попытался уменьшить размер входной строки для записи ... я попытался остановить поток ввода, чтобы было возможно, что каналы разорвутся, поскольку они заполнены, и данные не были полученыд.Но ничего не работает

Не могли бы вы помочь, пожалуйста.Спасибо

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Я не рассматривал код подробно, но код C устанавливает stdin как неблокирующий? Разве это не заставит C-программу сразу выйти, что приведет к разрыву канала при попытке записи в него?

0 голосов
/ 01 июня 2011

'Сломанный канал' означает, что вы записали канал, другой конец которого уже закрыт.Другими словами, вы нарушили протокол приложения между вами и получателем.Это не только вопрос буферизации, блокирования / неблокирования и т. Д., Это ошибка проектирования.

...