Questa domanda deriva dal mio tentativo di attuare le istruzioni in:tubazioni per l'input/output
Linux Pipes as Input and Output
How to send a simple string between two programs using pipes?
http://tldp.org/LDP/lpg/node11.html
La mia domanda è sulla falsariga della questione in: Linux Pipes as Input and Output, ma più specifico.
In sostanza, sto cercando di sostituire:
/directory/program <input.txt> output.txt
utilizzando tubi in C++, al fine di evitare di utilizzare il disco rigido. Ecco il mio codice:
//LET THE PLUMBING BEGIN
int fd_p2c[2], fd_pFc[2], bytes_read;
// "p2c" = pipe_to_child, "pFc" = pipe_from_child (see above link)
pid_t childpid;
char readbuffer[80];
string program_name;// <---- includes program name + full path
string gulp_command;// <---- includes my line-by-line stdin for program execution
string receive_output = "";
pipe(fd_p2c);//create pipe-to-child
pipe(fd_pFc);//create pipe-from-child
childpid = fork();//create fork
if (childpid < 0)
{
cout << "Fork failed" << endl;
exit(-1);
}
else if (childpid == 0)
{
dup2(0,fd_p2c[0]);//close stdout & make read end of p2c into stdout
close(fd_p2c[0]);//close read end of p2c
close(fd_p2c[1]);//close write end of p2c
dup2(1,fd_pFc[1]);//close stdin & make read end of pFc into stdin
close(fd_pFc[1]);//close write end of pFc
close(fd_pFc[0]);//close read end of pFc
//Execute the required program
execl(program_name.c_str(),program_name.c_str(),(char *) 0);
exit(0);
}
else
{
close(fd_p2c[0]);//close read end of p2c
close(fd_pFc[1]);//close write end of pFc
//"Loop" - send all data to child on write end of p2c
write(fd_p2c[1], gulp_command.c_str(), (strlen(gulp_command.c_str())));
close(fd_p2c[1]);//close write end of p2c
//Loop - receive all data to child on read end of pFc
while (1)
{
bytes_read = read(fd_pFc[0], readbuffer, sizeof(readbuffer));
if (bytes_read <= 0)//if nothing read from buffer...
break;//...break loop
receive_output += readbuffer;//append data to string
}
close(fd_pFc[0]);//close read end of pFc
}
Sono assolutamente sicuro che le stringhe di cui sopra sono inizializzate correttamente. Tuttavia, due cose che non hanno senso per me:
(1) Il programma che sto eseguendo segnala che "il file di input è vuoto". Poiché non sto chiamando il programma con "<", non dovrebbe aspettarsi un file di input. Invece, dovrebbe aspettarsi l'input da tastiera. Inoltre, dovrebbe leggere il testo contenuto in "gulp_command".
(2) Il rapporto del programma (fornito tramite uscita standard) viene visualizzato nel terminale. Questo è strano perché lo scopo di questo piping è di trasferire stdout alla mia stringa "receive_output". Ma dal momento che appare sullo schermo, questo mi indica che l'informazione non viene passata correttamente attraverso la pipe alla variabile. Se implemento quanto segue alla fine dell'istruzione if,
cout << receive_output << endl;
Non ottengo nulla, come se la stringa fosse vuota. Apprezzo qualsiasi aiuto tu possa darmi!
EDIT: Precisazione
Il mio programma attualmente comunica con un altro programma utilizzando i file di testo. Il mio programma scrive un file di testo (ad es. Input.txt), che viene letto dal programma esterno. Quel programma produce quindi output.txt, che viene letto dal mio programma. Quindi è qualcosa di simile:
my code -> input.txt -> program -> output.txt -> my code
Pertanto, il mio codice utilizza attualmente,
system("program <input.txt> output.txt");
voglio sostituire questo processo utilizzando tubi. Voglio passare il mio input come input standard al programma e fare in modo che il mio codice legga lo standard output di quel programma in una stringa.
La tua proposta di partenza non è chiara. Si dichiara di voler sostituire '/ directory/programma output.txt' con qualcosa usando le pipe per evitare l'accesso al file system. Ma hai "bisogno" di più processi per rendere sensato l'uso dei tubi. (Puoi _utilizzare pipe in un unico processo, ma di solito non ha senso.) Quindi potresti avere '/ directory/program1 output.txt'; questo ha senso (e potresti aver già usato '/ directory/program1 intermediate.txt;/directory/program2 output.txt'). Per favore chiarisci la tua intenzione. –
Buon punto. Ho modificato la domanda. –
Come ulteriore chiarimento, il mio obiettivo è fondamentalmente lo stesso della domanda in: stackoverflow.com/questions/1734932/... a cui hai risposto in precedenza (ottima risposta tra l'altro). –