Redireccionando...

isnhatar
03 de Septiembre del 2009
Bueno estoy haciendo una shell en unix y bueno al llegar a cierto punto tengo un problema, me ejecuta bien comandos y todo eso excepto los del tipo redireccionamito.
ej: who > quienes.txt

Bueno aqui os dejo codigo a ver si me lo podeis resolver. Igual es un poco lioso pero si teneis alguna duda preguntais.

#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/wait.h>
#include <stdlib.h>
#include <fstream>
#include <fcntl.h>
using namespace std;

const int MAX_ELEMENTOS=12; //De esta manera limitamos un numero maximo de "comandos", en este caso lo limitamos a 12.

void trocear_linea(char *, char *[]); //Utilizaremos esta funcion para dividir la linea de comandos que nosotros le metemos.


int main(int argc, char *argv[])
{
char cadena[100];
char *lista_elementos[MAX_ELEMENTOS];

char linea[256];

ifstream entrada; //define un flujo de entrada

pid_t pid; //Declaramos la variable pid.

if (argc>2)
{
cout<<"Número de argumentos incorrecto.";
exit(1);
}

else
{

if (argc<2)
{
cout<<"PROMPT-MI-SHELL: ";
cin.getline(cadena,100);

trocear_linea(cadena,lista_elementos);


while (strcmp(lista_elementos[0],"salir")!=0)
{
pid=fork(); //Creamos un proceso hijo.

if(pid==0) //Evaluamos el pid del hijo y entonces ejecutamos el comando.
{
if (execvp(lista_elementos[0], lista_elementos)==-1)
{
perror("Error al ejecutar la funcion execvpn"); //Este error aparecerá cuando introduzcamos comandos erroneos.
exit(1);

}
}
else
{
wait(NULL);
cout<<"PROMPT-MI-SHELL: ";
cin.getline(cadena,100);
trocear_linea(cadena,lista_elementos);
}

}
}

else
{
entrada.open(argv[1]); //abre el fichero y lo asocia a entrada
if(entrada.fail()) //comprueba que se ha abierto correctamente
{
cout<<"No puede abrirse el archivo "<<argv[1]<<endl;

}
else
{
while (! entrada.eof())
{
entrada.getline(linea,256); //lee una línea del fichero
trocear_linea(linea,lista_elementos);

while (strcmp(lista_elementos[0],"salir")!=0)
{
pid=fork(); //Creamos un proceso hijo.

if(pid==0) //Evaluamos el pid del hijo y entonces ejecutamos el comando.
{
if (execvp(lista_elementos[0], lista_elementos)==-1)
{
perror("Error al ejecutar la funcion execvpn"); //Este error aparecerá cuando introduzcamos comandos erroneos.

}
}
else
{
wait(NULL);
cout<<"PROMPT-MI-SHELL: ";
cin.getline(cadena,100);
trocear_linea(cadena,lista_elementos);
}

}

}
}

}}
cout<<"El programa ha terminado";

}

void trocear_linea(char *linea, char *lista_elementos[])
{
char *elemento;
const char DELIMITADOR[]=" t"; //Espacio en blanco o tabulador.
int num; //Número de elementos.

num=0;
while (linea!=NULL && num<MAX_ELEMENTOS)
{
elemento=strsep(&linea,DELIMITADOR);
if (strcmp(elemento,"")!=0)
{
lista_elementos[num]=elemento;
num++;
}
}
lista_elementos[num]=NULL;
}