Diese Frage von meinem Versuch, folgt den Anweisungen in implementieren:Piping für die Eingabe/Ausgabe-
Linux Pipes as Input and Output
How to send a simple string between two programs using pipes?
http://tldp.org/LDP/lpg/node11.html
Meine Frage nach dem Vorbild der Frage ist in: Linux Pipes as Input and Output, aber spezifischer.
Im Grunde versuche ich, zu ersetzen:
/directory/program <input.txt> output.txt
mit Rohren in C++, um mit der Festplatte zu vermeiden. Hier ist mein Code:
//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
}
Ich bin absolut sicher, dass die oben genannten Zeichenfolgen ordnungsgemäß initialisiert werden. Allerdings passieren zwei Dinge, die für mich keinen Sinn ergeben:
(1) Das Programm, das ich ausführe meldet, dass die "Eingabedatei leer ist." Da ich das Programm nicht mit "<" anrufe, sollte es keine Eingabedatei erwarten. Stattdessen sollte Tastatureingabe erwartet werden. Außerdem sollte es den Text lesen, der in "gulp_command" enthalten ist.
(2) Der Bericht des Programms (über die Standardausgabe bereitgestellt) wird im Terminal angezeigt. Das ist seltsam, weil der Zweck dieses Pipings darin besteht, stdout in meine Zeichenfolge "receive_output" zu übertragen. Aber da es auf dem Bildschirm erscheint, zeigt mir das an, dass die Information nicht korrekt durch die Pipe an die Variable übergeben wird. Wenn ich Folgendes am Ende der if-Anweisung implementiere:
Ich bekomme nichts, als ob die Zeichenfolge leer ist. Ich schätze jede Hilfe, die Sie mir geben können!
EDIT: Klarstellung
Mein Programm in Verbindung steht zur Zeit mit einem anderen Programm mit Textdateien. Mein Programm schreibt eine Textdatei (z. B. input.txt), die vom externen Programm gelesen wird. Dieses Programm erzeugt dann output.txt, das von meinem Programm gelesen wird. Es ist also so etwas wie dieses:
my code -> input.txt -> program -> output.txt -> my code
Daher mein Code verwendet derzeit,
system("program <input.txt> output.txt");
Ich möchte diesen Prozess ersetzen Verwendung Rohren. Ich möchte meine Eingabe als Standardeingabe an das Programm übergeben und meinen Code die Standardausgabe von diesem Programm in eine Zeichenfolge lesen lassen.
Ihr Ausgangsvorschlag ist nicht klar. Sie geben an, dass Sie "/ verzeichnis/program output.txt" durch etwas ersetzen möchten, das Pipes verwendet, um Dateisystemzugriff zu vermeiden. Aber Sie brauchen mehrere Prozesse, um die Verwendung von Rohren sinnvoll zu machen. (Sie können Pipes in einem einzigen Prozess verwenden, aber das macht normalerweise keinen Sinn.) Sie könnten also '/ directory/program1 Ausgabe.txt'; das macht Sinn (und Sie könnten zuvor '/ directory/program1 intermediate.txt;/directory/program2 output.txt') verwendet haben. Bitte klären Sie Ihre Absicht. –
Guter Punkt. Ich habe die Frage bearbeitet. –
Als zusätzliche Erklärung, mein Ziel ist im Grunde das gleiche wie die Frage in: stackoverflow.com/questions/1734932/..., die Sie zuvor beantwortet haben (große Antwort übrigens). –