Básicamente, he creado un caparazón usando comandos POSIX estándar, también quiero poder implementar tuberías. En este momento, maneja los comandos correctamente y puede procesar el fondo con &. Pero necesito poder usar tuberías | y >> también. Por ejemplo algo como esto: cat file1 file2 >> file3 cat file1 file2 | más más archivo1 | grep stuffImplementando tuberías en un caparazón C (Unix)
Aquí está el código que tengo actualmente. También quiero EVITAR llamadas al "SISTEMA". Sé que necesito usar dup2, pero la forma en que hice mi código es un poco extraña, así que espero que alguien me diga si es factible implementar tuberías en este código. ¡Gracias! Sé que se usa dup2, pero también soy def. confundido sobre cómo implementar >> tan BIEN como |
#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;
}
¿Por qué intentabas evitar las llamadas al sistema? ¿Portabilidad? Puede quedarse con las llamadas al sistema especificadas POSIX tanto como sea posible. Además, tu caparazón es una extraña mezcla de C y C++. – nategoose