Ayuda creando Shell con execvp y fork

Iniciado por erovira, 24 Octubre 2015, 10:51 AM

0 Miembros y 1 Visitante están viendo este tema.

erovira

Buenos días,
vamos a ver, estoy intentando crear un shell en C llamado Gungan, lo que hago simplemente es leer la instrucción que el usuario entre, hacer un hijo para poder usar execvp y ejecutar dicha instrucción. A "bajo nivel", nada de printf, scanf... Con system en vez de execvp sé hacerlo, pero con el execvp no lo consigo.
El tema está en que si entra "ls", el programa tal y como lo tengo me funciona, pero cuando intento entrar un parámetro de la instrucción, por ejemplo: "ls -l", me hace un ls, como si no cogiese el -l.
Argv según leí (a parte de ser el valor que le puedes pasar a un programa al ejecutarlo), también es un puntero a una lista con todas las instrucciones de sistema, por eso se lo pongo al execvp(aux, argv).

Alguna idea de como poder entrar instrucciones con parámetros? (ls -l), (ps aux), (ps -ef) ...

Gracias de antemano!


#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]){

int i = 0;
int fill;
char frase[100];
char command[15];
int fd;
char aux[10];
   
sprintf(command,"Gungan>> ");
write(1,command,strlen(command));
read(0, &aux[i],1);
   
while(aux[i] != '\n'){
i++;
read(0,&aux[i],1);
}
aux[i]='\0';
printf("%s", aux);

       fill = fork();
if (fill>0){ //codi pel pare
wait();
exit(0);
}
else{
if (fill==0){ //codi pel fill
if(execvp(aux, argv) < 0){
printf("Error merdix");
}  
  exit(0);
}
else { //codi si tira error el fork
    sprintf(frase,"JARL!! ERROR\n");
write(1,frase,strlen(frase));
}
}
return 0;
}


Si uso:

char *args[] = {"ls","-l",NULL};
execvp(args[0],args);


Si que me ejecuta bien el ls -l cosa que no entiendo, ya que el primer parámetro de execvp te indica cual es la instrucción a ejecutar y el segundo parámetro(args), en qué lista encontrarlo o eso creo. Aunque execvP ya de por sí usa la variable de entorno PATH, así que ni idea, a ver si alguien me aclara un poco

Stakewinner00

Que es lo que no te va? Tal y como lo tienes programado si lo ejecutas como "./tuprograma -parametros" y luego introduces el ejecutable funciona.
Si quieres leer tambien los parametros desde tu programa con el teclado deberías modificar el código para leer los argumentos.

erovira

Pues la intención es buclarlo infinitamente mas adelante y solo poder pararlo con control C cambiando un par de interrupciones, pero aun queda para eso. Por eso no puedo pasar parámetros al ejecutar el programa, porque puede que ahora me hagan ls -l y justo después sin salir del programa hagan ps -ef por ejemplo

erovira

Cita de: Stakewinner00 en 24 Octubre 2015, 11:20 AM
Que es lo que no te va? Tal y como lo tienes programado si lo ejecutas como "./tuprograma -parametros" y luego introduces el ejecutable funciona.
Si quieres leer tambien los parametros desde tu programa con el teclado deberías modificar el código para leer los argumentos.

Vale y como le paso los parámetros al execvp?