Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erovira en 24 Octubre 2015, 10:51 am



Título: Ayuda creando Shell con execvp y fork
Publicado por: erovira en 24 Octubre 2015, 10:51 am
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!

Código
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5.  
  6. int main(int argc, char *argv[]){
  7.  
  8. int i = 0;
  9. int fill;
  10. char frase[100];
  11. char command[15];
  12. int fd;
  13. char aux[10];
  14.  
  15. sprintf(command,"Gungan>> ");
  16. write(1,command,strlen(command));
  17. read(0, &aux[i],1);
  18.  
  19. while(aux[i] != '\n'){
  20. i++;
  21. read(0,&aux[i],1);
  22. }
  23. aux[i]='\0';
  24. printf("%s", aux);
  25.  
  26.        fill = fork();
  27. if (fill>0){ //codi pel pare
  28. wait();
  29. exit(0);
  30. }
  31. else{
  32. if (fill==0){ //codi pel fill
  33. if(execvp(aux, argv) < 0){
  34. printf("Error merdix");
  35. }  
  36.   exit(0);
  37. }
  38. else { //codi si tira error el fork
  39.     sprintf(frase,"JARL!! ERROR\n");
  40. write(1,frase,strlen(frase));
  41. }
  42. }
  43. return 0;
  44. }
  45.  

Si uso:
Código
  1. char *args[] = {"ls","-l",NULL};
  2. execvp(args[0],args);
  3.  

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


Título: Re: Ayuda creando Shell con execvp y fork
Publicado por: 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.


Título: Re: Ayuda creando Shell con execvp y fork
Publicado por: erovira en 24 Octubre 2015, 11:30 am
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


Título: Re: Ayuda creando Shell con execvp y fork
Publicado por: erovira en 24 Octubre 2015, 11:32 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?