elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Confusion al utilizar execl en un fork()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Confusion al utilizar execl en un fork()  (Leído 6,210 veces)
z3k4

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Confusion al utilizar execl en un fork()
« 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;
}


En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Confusion al utilizar execl en un fork()
« Respuesta #1 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.


En línea

z3k4

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Confusion al utilizar execl en un fork()
« Respuesta #2 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...
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Confusion al utilizar execl en un fork()
« Respuesta #3 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.
En línea

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Confusion al utilizar execl en un fork()
« Respuesta #4 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. }
En línea

z3k4

Desconectado Desconectado

Mensajes: 8


Ver Perfil
Re: Confusion al utilizar execl en un fork()
« Respuesta #5 en: 11 Marzo 2011, 19:10 pm »

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

[L]ord [R]NA


Desconectado Desconectado

Mensajes: 1.513

El Dictador y Verdugo de H-Sec


Ver Perfil WWW
Re: Confusion al utilizar execl en un fork()
« Respuesta #6 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. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fork en php
PHP
WHK 0 3,675 Último mensaje 8 Diciembre 2007, 09:26 am
por WHK
execl adapter
Java
sapito169 0 3,154 Último mensaje 14 Agosto 2008, 10:07 am
por sapito169
Emular MultiHilos (multithread) Sin Fork (FAKE FORK) « 1 2 »
PHP
OzX 14 9,489 Último mensaje 27 Marzo 2009, 00:24 am
por OzX
hacer esto con fork esta bien?
Programación C/C++
Belial & Grimoire 5 4,168 Último mensaje 28 Septiembre 2010, 16:26 pm
por [L]ord [R]NA
FORK en java
Java
reylagarto19 7 6,788 Último mensaje 1 Agosto 2012, 20:47 pm
por egyware
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines