La mise en œuvre des Tuyaux en C shell (Unix)

Fondamentalement, j'ai créé un shell à l'aide de la norme POSIX commandes, je veux être en mesure de mettre en Œuvre la Tuyauterie. Maintenant il gère les commandes correctement, peut faire le traitement de fond avec des &. Mais j'ai besoin d'être en mesure de tuyau à l'aide de | et >>.
Par exemple quelque chose comme ceci:
cat fichier1 fichier2 >> fichier3
cat fichier1 fichier2 | plus d'
plus fichier1 | grep trucs

Voici le code que j'ai actuellement. Je tiens également à ÉVITER le "SYSTÈME" des appels. Je sais que U besoin d'utiliser dup2, mais la façon dont j'ai fait mon code est un peu bizarre, donc im espérant si quelqu'un peut me dire si il est possible de mettre en œuvre des tuyaux dans ce code? merci! Je sais dup2 est utilisé, mais aussi im def. confus sur la façon de mettre en œuvre >> AINSI que |

#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <string>
#include <iostream>
#include <stdlib.h> 
#include <stdio.h>
using namespace std;
void Execute(char* command[],bool BG)
{
//Int Status is Used Purely for the waitpid, fork() is set up like normal.
int status;
pid_t pid = fork();
switch(pid)
{
case  0:
execvp(command[0], command);
if(execvp(command[0], command) == -1)
{
cout << "Command Not Found" << endl;
exit(0);
}
default:
if(BG == 0)
{
waitpid(pid, &status, 0);
//Debug             cout << "DEBUG:Child Finished" << endl;
}
}
}
bool ParseArg(char* prompt, char* command[], char Readin[],bool BG)
{
fprintf(stderr, "myshell>");
cin.getline(Readin,50);
prompt = strtok(Readin, " ");
int i = 0;
while(prompt != NULL)
{
command[i] = prompt;
if(strcmp(command[i], "&") == 0){
//Debug        cout << "& found";
command[i] = NULL;
return true;
}
//Debug        cout << command[i] << " ";
i++;
prompt = strtok(NULL, " ");
}
return false;
}
void Clean(char* command[])
{
//Clean Array
for(int a=0; a < 50; a++)
{
command[a] = NULL;
}
}
int main()
{
char* prompt;
char* command[50];
char Readin[50]; 
bool BG = false;
while(command[0] != NULL)
{
Clean(command);
BG = ParseArg(prompt, command, Readin, BG);
if(strcmp(command[0], "exit") == 0 || strcmp(command[0], "quit") == 0 )
{
break;
}
else
{
Execute(command,BG);
}
}
return 1;
}
Pourquoi avez-vous été en essayant d'éviter les appels système? La portabilité? Vous pouvez coller avec la POSIX spécifié appels système autant que possible. Aussi, votre shell est un étrange mélange de C et de C++.

OriginalL'auteur | 2010-10-14