conduttura guai tre comandi “dmesg | sorta | more” C ++
Domanda
Ho convogliato con successo l'output di un comando all'ingresso di un altro e poi mostrare l'uscita del secondo comando sullo schermo.
voglio fare questo con tre comandi successivi. (In realtà alla fine voglio farlo con N comandi inviati al programma in fase di esecuzione.
Questo è il mio tentativo di pipelining tre comandi insieme.
Aggiornamento: Ho aggiornato la mia domanda per riflettere il mio ultimo tentativo.
#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;
}
Ho hard coded tutti i valori di semplicità. Il programma visualizza quello che dovrebbe essere l'uscita di "dmesg | more", ma non fa la parte di ordinamento e poi si blocca. Vedo l'accattonaggio di dmesg e più in basso a sinistra, ma non riesco a vedere più.
Tutte le idee?
Soluzione
pipe(2)
fornisce solo 2 descrittori di file per 1 tubo. Il descrittore di file di 3 ° (pfd[2]
) è spazzatura e non è mai sempre inizializzato. Se si desidera creare una pipeline con 3 comandi in esso, è necessario chiamare pipe()
due volte per ottenere due tubi: uno per il collegamento del primo e secondo processi, e uno per il collegamento del secondo e terzo processi