2015-05-25 11 views
6

Potrzebuję otworzyć podproces za pomocą popenu, proces będzie ciągle prosić o dane wejściowe użytkownika ... Główny proces musi wysłać te dane przez potok.Ciągłe zapisywanie w podprocesie za pomocą popenu w C++

Jest to moja pierwsza próba:

FILE *in; 
char buff[1024]; 

if(!(in = popen("cd FIX/fix2/src; java -cp .:./* com.fix.bot", "w"))){ 
    return 1; 
} 

while(1){ 
    char buffer[] = { 'x' }; 
    fwrite(buffer, sizeof(char), sizeof(buffer), in); 

    cout << "Wrote!" << endl; 
    usleep(1000000); 
} 

Jednak dane nie są wysyłane! Muszę zamknąć potok za pomocą pclose(), aby dane zostały zapisane w procesie. Jak mogę się upewnić, że dane są zapisywane bez konieczności zamykania rury za każdym razem?

+1

Czy jest możliwe, że twoja aplikacja szuka danych wejściowych zakończonych \ n? Ponieważ nie wysyłasz teraz LF ... –

+0

Nie zapomnij sprawdzić wyniku 'fwrite()' Nie sądzę, że to gwarantuje, że napiszesz wszystko, o co prosisz. Zwykle tak jest, ale musisz potwierdzić. –

Odpowiedz

1

Będziesz chciał zadzwonić pod numer fflush(in), aby upewnić się, że buforowane dane zostały faktycznie zapisane w strumieniu.

Sprawdź również, czy java -cp .:./* w komendzie nie rozwija się do niepoprawnej ścieżki klasy. Myślę, że rozwiąże to kilka argumentów, jeśli w bieżącym katalogu znajduje się więcej niż jeden plik, a nie rzeczywiste wpisy w ścieżce klas.

+1

W dalszym ciągu nie spłukuje się ... Nadal muszę zamknąć rurę nawet przy użyciu fflush(). Jaki może być problem? –

+0

Uaktualniłem odpowiedź i myślę, że może się również zdarzyć, że ścieżka klasy jest źle ustawiona. Spróbuj wykonać polecenie 'echo java -cp.: ./*', aby sprawdzić, czy wygląda ono legalnie. – Misandrist

+1

Upewnię się, aby sprawdzić polecenie, aby otworzyć proces java ... Ale jak na razie wygląda na to, że działa dobrze. Dane są zapisywane do potoku, gdy go zamykam, a proces Java odpowiada odpowiednio. Ale muszę się upewnić, że dane są przepłukiwane ... –

0

Działa to dla mnie:

#include <stdio.h> 
#include <unistd.h> 
#include <iostream> 

int main(int argc, char ** argv) { 
    FILE *in; 
    char buff[1024]; 

    if(!(in = popen("./2.sh", "w"))){ 
     return 1; 
    } 

    while(1) { 
     char buffer[] = "xx\n"; 
     fwrite(buffer, sizeof(char), sizeof(buffer), in); 
     fflush(in); 
     std::cout << "Wrote!" << std::endl; 
     usleep(1000000); 
    } 
} 

gdzie 2.sh jest:

#!/bin/sh 

read INP 
echo 'read: ' $INP 

Więc jestem naprawdę podejrzewać, że problem brakuje. \ N

Powiązane problemy