Ver Mensaje Individual
  #3 (permalink)  
Antiguo 15/12/2012, 21:37
Avatar de yasi92
yasi92
 
Fecha de Ingreso: agosto-2011
Mensajes: 2
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Implementar Shell en C++ (redirecciones y tuberias) para poder ejecutarla

No no buso eso, solo busco ayuda.... a ver empiezo...la idea es que estoy creando una mini shell, ya me ejeuta los comandos basicos y ahora tengo que implementarle en primer lugar las redirecciones, esta seria mi estructura actual:

bool defaultCommandCallback(const std::string& command,
cli::ShellArguments const& arguments)
{
using namespace cli::prettyprint;
int status1;
while (waitpid(-1, NULL, WNOHANG) > 0);
pid_t cpid = fork();

//hijo
if (cpid==0) {

if (!arguments.arguments.empty()){

char** argv=cli::utility::stdVectorStringToArgV(arguments .arguments);
execvp(argv[0],argv);

//error
std::cout << "Se ha producido un error al invocar el comando";
exit(-1);
}
//padre
}else if (cpid > 0) {
if (arguments.terminator==cli::ShellArguments::NORMAL ){
waitpid(cpid, &status1, 0);
}
}else{
std::cout << "Se ha producido un error al invocar el comando";

}
return false;
}
-------------------------------------------------------------------------------------------
ahora segun tengo entendido, dentro de el hijo deberia añadir algo mas o menos asi:
Aunque nose como generar el bucle for que me revise la salida del comando a ver si se trata de una redirección:

if (iter->type==StdioRedirection::TRUNCATED_INPUT){
int fd= open (iter -> argument.c.str(), O_RDONLY);
if (fd>=0){
dup2(fd,0);
close(fd);}
else{
std::cout << "Ha habido un error al tratar de abrir el archivo";}
}

if (iter->type==StdioRedirection::TRUNCATED_OUTPUT){
int fd= open (iter -> argument.c.str(), O_CREATE | O_TRUNC| O_RDWR , S_IWUSR| S_IRUSR| S_IRGRP |S_IWGRP | S_IXGRP | S_IROTH);
if (fd>=0){
dup2(fd,0);
close(fd);}
else{
std::cout << "Ha habido un error al tratar de abrir el archivo";}
}

if (iter->type==StdioRedirection::APPENDED_OUTPUT){
int fd= open (iter -> argument.c.str(), O_CREAT | O_APPEND | O_RDWR , S_IWUSR| S_IRUSR| S_IRGRP |S_IWGRP | S_IXGRP | S_IROTH );
if (fd>=0){
dup2(fd,0);
close(fd);}
else{std::cout << "Ha habido un error al tratar de abrir el archivo";}

}