Confusion al utilizar execl en un fork()

Iniciado por z3k4, 11 Marzo 2011, 14:45 PM

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

z3k4

     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;
}

[L]ord [R]NA

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.

z3k4

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...

Akai

Yo que tu me miraría la referencia de execl:
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.

[L]ord [R]NA

Prueba con esto

#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[1],"malo")==0)//Cambiar argv[0] por argv[1]
      {
   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;
}

z3k4

Nada no consigo solucionar nada. Tal y como lo has puesto  queda en bucle infinito que putada.

[L]ord [R]NA

Ya vi el bucle... la linea 21 lo provoca. Si llamas con el parametro malo, siempre sera el malo.

Código (c,21) [Seleccionar]
#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[1],"malo")==0)//Cambiar argv[0] por argv[1]
      {
   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;
}