2015-05-25 17 views
6

devo aprire un sottoprocesso usando popen, il processo continuamente chiedere input dell'utente ... Il processo principale deve inviare tali dati sul tubo.continuamente scrivere al sottoprocesso usando popen in C++

Questo è il mio primo tentativo:

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

Tuttavia i dati non vengono inviati! Ho bisogno di chiudere la pipe con pclose() in modo che i dati vengano scritti nel processo. Come posso assicurarmi di scrivere i dati senza dover chiudere il tubo ogni volta?

+1

è possibile che la tua app stia cercando l'input terminato con un \ n? Perché non stai inviando una LF adesso ... –

+0

Non dimenticare di controllare il risultato di 'fwrite()' Non penso che garantisca di scrivere tutto ciò che richiedi. Di solito lo fa, ma è necessario convalidare. –

risposta

1

si vorrà chiamare fflush(in) per assicurarsi che i dati buffer è in realtà scritto nel flusso.

Verificare inoltre che java -cp .:./* nel comando non si sta espandendo ad un percorso di classe non valida. Penso che finirà per espandersi a diversi argomenti se c'è più di un file nella directory corrente, e non le attuali voci del percorso di classe.

+1

Ancora non scarica ... Devo ancora chiudere il tubo anche con fflush(). Quale potrebbe essere il problema? –

+0

Ho aggiornato la risposta, e penso che potrebbe anche essere che il percorso di classe sia impostato in modo errato. Prova a fare 'echo java -cp.: ./*' per vedere se sembra legittimo. – Misandrist

+1

Mi assicurerò di controllare il comando per aprire il processo java ... Ma finora sembra funzionare bene. I dati vengono scritti nella pipe quando la chiudo e il processo Java risponde di conseguenza. Ma ho bisogno di assicurarmi che i dati vengano lavati ... –

0

questo funziona per me:

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

dove 2.sh è:

#!/bin/sh 

read INP 
echo 'read: ' $INP 

quindi sono davvero sospettare che il problema non è presente \ n.