Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: z3k4 en 11 Marzo 2011, 14:45 pm



Título: Confusion al utilizar execl en un fork()
Publicado por: z3k4 en 11 Marzo 2011, 14:45 pm
     Hola amigos, les cuento el siguiente problema: Al hacer un fork() como sabeis se crean dos procesos iguales y con el mismo nombre. Uno es el padre y otro el hijo. Pues bien lo que necesito hacer es que el hijo cambie el nombre de su proceso utilizando la funcion execl a la que le paso como parametros la direccion del ejecutable, el nuevo nombre que va a tener el proceso hijo y NULL porque no se necesita nada mas o eso creo.
     Me ocurre lo siguiente: Al hacer la llamada al sistema execl el sistema se olvida del programa y vuelve a empezar a ejecutarse desde el main y entonces se me queda en bucle infinito creando hijos con el nuevo nombre de forma que no para de reproducirse. xD. Tengo que evitar que al volver a ejecutarse desde el main vuelva a pasar por el mismo fork() pero llevo dias intentandolo y no soy capaz.
    Se que tengo que utilizar argv[0] para algo porque me lo aconsejo el profesor, pero no soy capaz de adivinarlo. Hechen me una mano por favor!! Muchas gracias.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <errno.h>

int main (int argc,char *argv[])
{
     
     
      if(strcmp(argv[0],"malo")==0)//ESTO SE QUE ESTA MAL!
      {
   switch(fork())
   {
      case -1: 
         perror("Error al crear al Malo\n");
                exit(1);
      case 0: //SOY EL MALO
         fprintf(stdout,"Soy el Malo\n");         
         if(execl("./prueba1","malo",NULL)==-1)
         {
                       perror("Error al cambiar el proceso de nombre\n");
                  exit(2);   
                   }     
         pause();
         break;
      default: //SOY CHARLIE
         fprintf(stdout,"Soy Charlie\n");
         pause();
         break;
   }
      }
   return 0;
}


Título: Re: Confusion al utilizar execl en un fork()
Publicado por: [L]ord [R]NA en 11 Marzo 2011, 15:17 pm
En argv[0] esta el nombre del ejecutable... por cierto solo existe una forma de que se cree un bucle infinito en tu programa... que el programa que llamas sea el mismo que ejecutaste.


Título: Re: Confusion al utilizar execl en un fork()
Publicado por: z3k4 en 11 Marzo 2011, 15:41 pm
No llamo al mismo programa que ejecute, se que argv[0] es en principio el nombre del ejecutable, pero cuando llamo a la funcion execl("ruta del ejecutable","nuevo nombre",NULL) al volver a entrar en el main argv[0] es igual a "nuevo nombre" no el nombre del principio. No paro de romperme la cabeza...


Título: Re: Confusion al utilizar execl en un fork()
Publicado por: Akai en 11 Marzo 2011, 16:28 pm
Yo que tu me miraría la referencia de execl:
Código
  1. int execl(const char *path, const char *arg, ...);

path es la dirección del ejecutable.

argv[0] es el comando con el cual se ha lanzado el ejecutable, es decir, suponiendo que tu has lanzado el comando ./prueba1, argv[0] es ./prueba1.

PERO tu problema en el execl, es que estás pasando la dirección del ejecutable como "./prueba1" cuando ele ejecutable NO se llama así, se llama "prueba1" o como se llame.


Título: Re: Confusion al utilizar execl en un fork()
Publicado por: [L]ord [R]NA en 11 Marzo 2011, 16:46 pm
Prueba con esto

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <signal.h>
  6. #include <errno.h>
  7.  
  8. int main (int argc,char *argv[])
  9. {
  10.  
  11.  
  12.      if(strcmp(argv[1],"malo")==0)//Cambiar argv[0] por argv[1]
  13.      {
  14.   switch(fork())
  15.   {
  16.      case -1:  
  17.         perror("Error al crear al Malo\n");
  18.                exit(1);
  19.      case 0: //SOY EL MALO
  20.         fprintf(stdout,"Soy el Malo\n");        
  21.         if(execl("./prueba1","malo",NULL)==-1)
  22.         {
  23.                       perror("Error al cambiar el proceso de nombre\n");
  24.                  exit(2);  
  25.                   }      
  26.         pause();
  27.         break;
  28.      default: //SOY CHARLIE
  29.         fprintf(stdout,"Soy Charlie\n");
  30.         pause();
  31.         break;
  32.   }
  33.      }
  34.   return 0;
  35. }


Título: Re: Confusion al utilizar execl en un fork()
Publicado por: z3k4 en 11 Marzo 2011, 19:10 pm
Nada no consigo solucionar nada. Tal y como lo has puesto  queda en bucle infinito que putada.


Título: Re: Confusion al utilizar execl en un fork()
Publicado por: [L]ord [R]NA en 12 Marzo 2011, 02:38 am
Ya vi el bucle... la linea 21 lo provoca. Si llamas con el parametro malo, siempre sera el malo.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <signal.h>
  6. #include <errno.h>
  7.  
  8. int main (int argc,char *argv[])
  9. {
  10.  
  11.  
  12.      if(strcmp(argv[1],"malo")==0)//Cambiar argv[0] por argv[1]
  13.      {
  14.   switch(fork())
  15.   {
  16.      case -1:  
  17.         perror("Error al crear al Malo\n");
  18.                exit(1);
  19.      case 0: //SOY EL MALO
  20.         fprintf(stdout,"Soy el Malo\n");        
  21.         if(execl("./prueba1","malo",NULL)==-1)
  22.         {
  23.                       perror("Error al cambiar el proceso de nombre\n");
  24.                  exit(2);  
  25.                   }      
  26.         pause();
  27.         break;
  28.      default: //SOY CHARLIE
  29.         fprintf(stdout,"Soy Charlie\n");
  30.         pause();
  31.         break;
  32.   }
  33.      }
  34.   return 0;
  35. }