Probleme Pipeline drei Befehle „dmesg | sortieren | mehr“ c ++
Frage
I haben verrohrt erfolgreich die Ausgabe eines Befehls in den Eingang des anderen und zeigen dann die Ausgabe des zweiten Befehls auf den Bildschirm.
Ich möchte diese aufeinanderfolgende Befehle mit drei zu tun. (Eigentlich schließlich will ich es tun mit N in das Programm zur Laufzeit übergeben Befehle.
Dies ist mein Versuch, Pipelining drei Befehle zusammen.
AKTUALISIERT: i aktualisierte meine Frage meinen letzten Versuch zu reflektieren.
#include <string.h>
#include <fstream>
#include <iostream>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
using namespace std;
int main(int argc, char * argv[])
{
pid_t pid;
int pfd[2];
char* prgname = NULL;
if(pipe(pfd) == -1)
{
perror("error on pipe call");
return(1);
}
for(int j = 0;j<numberOfCommands;j++)
{
cout<<commands[j]<<"_"<<endl;
}
pid = fork();
if(pid == 0){//child process
close(pfd[0]); //close read end of pipe
dup2(pfd[1],1);//connect the pipes
close(pfd[1]);//close extra file descriptors
prgname = (char*)"dmesg"; //commands[0];//first command
execlp(prgname, prgname, 0);//Load the program
}
else
{
int pfd2[2];
if(pipe(pfd2) == -1)
{
perror("error on pipe call 2");
return(1);
}
pid = fork();
if(pid == 0)//child
{
close(pfd[1]);
dup2(pfd[0],0);
close(pfd[0]);
close(pfd2[0]);
dup2(pfd2[1],1);
close(pfd2[1]);
prgname = (char*)"sort";
execlp(prgname,prgname,0);
}
else
{
close(pfd2[1]); //close the write end of the pipe
dup2(pfd2[0],0);//connect the pipes
close(pfd2[0]); //close extra file descriptor
prgname = (char*)"more"; //commands[1];//now run the second command
execlp(prgname, prgname, 0);//Load the program
}
}
return 0;
}
Ich habe hart alle Werte der Einfachheit halber codiert. Das Programm zeigt, welche die Ausgabe von „dmesg | mehr“ sein sollten, aber nicht die Art Teil tun und dann friert. Ich sehe das Betteln von dmesg und mehr in den linken unteren, aber ich nicht mehr sehen kann.
Irgendwelche Ideen?
Lösung
pipe(2)
bietet nur 2 Filedeskriptoren für 1 Rohr. Der 3. Dateideskriptor (pfd[2]
) ist Junk und wird nie initialisiert zu werden. Wenn Sie eine Pipeline mit drei Befehle darin erstellen möchten, müssen Sie pipe()
zweimal anrufen zwei Rohre zu bekommen: eine für die ersten und zweiten Verfahren verbindet, und eine für den zweiten und dritten Prozesse verbinden