• Viernes 15 de Noviembre de 2024, 09:54

Autor Tema:  Ejecutar fichero .exe  (Leído 906 veces)

pepsenma

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Ejecutar fichero .exe
« en: Lunes 4 de Mayo de 2009, 16:43 »
0
Muy buenas,

Hace dias que me estoy comiendo el coco con esto. Necesitaria poder ejecutar un programa en C, y redireccionar su salida a traves de sockets.

Mi forma de hacerlo es via pipe/dup2/execl. No se si es la mejor manera pero es la única que se me ha ocurrido.

Les muestro mi codigo y a ver si saben donde puedo fallar. El problema es que siempre sale el error de "[Error en el paso de los fitcheros]".



if (pipe(fd) == -1){
   perror("Creating pipe");
        exit(1);
}

pid=fork();
   
switch(pid){
   case -1:
      write(1,"Error en el forkn", strlen("Error en el forkn"));
   break;
      
   case 0:
      close(fd[0]);
      dup2(fd[1], 1);
      strcpy(path,"./progs/");
      strcat(path,nom);
      execl("./progs/","./progs/", NULL);
      write(1,"[Error en el paso de los fitcheros]n",strlen("[Error en el paso de los fitcheros]n");
      exit(0);      
   break;
      
   default:
         
           close(fd[1]);
      i=0;
 
        //Aqui vendria toda la lectura de la pipe y el envio a traves de sockets

      }


Muchas gracias por vuestro tiempo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ejecutar fichero .exe
« Respuesta #1 en: Lunes 4 de Mayo de 2009, 18:22 »
0
Hola Josep

Utiliza las etiquetas de código:

Código: C
  1. if (pipe(fd) == -1){
  2.     perror("Creating pipe");
  3.     exit(1);
  4. }
  5.  
  6. pid=fork();
  7.  
  8. switch(pid){
  9.     case -1:
  10.         write(1,"Error en el forkn", strlen("Error en el forkn"));
  11.         break;
  12.  
  13.     case 0:
  14.         close(fd[0]);
  15.         dup2(fd[1], 1);
  16.         strcpy(path,"./progs/");
  17.         strcat(path,nom);
  18.         execl("./progs/","./progs/", NULL);
  19.         write(1,"[Error en el paso de los fitcheros]n",strlen("[Error en el paso de los fitcheros]n");
  20.         exit(0);
  21.         break;
  22.  
  23.     default:
  24.         close(fd[1]);
  25.         i=0;
  26.  
  27. //Aqui vendria toda la lectura de la pipe y el envio a traves de sockets
  28.  
  29. }
  30.  
Es normal que te salga "[Error en el paso de los fitcheros]" porque según tu código se ejecuta siempre esa sentencia para el proceso hijo. Supongo que habrás querido poner:

Código: C
  1. if (execl("./progs/","./progs/", NULL) == -1)
  2. {
  3.     write(1,"[Error en el paso de los fitcheros]n",strlen("[Error en el paso de los fitcheros]n");
  4.     exit(0);
  5. }
  6.  
Además fíjate que a execl() no le pasas ningún fichero a ejecutar, sólo un directorio. Además, el segundo parámetro deben ser los argumentos para el ejecutable. Resulta inútil pasarle la misma ruta que en el primer parámetro.

Fíjate también que no has cerrado la llave del switch.

PD: Por cierto, la ruta que especificas suena a ruta de sistema *IX, que no son Windows y cuyos ejecutables no son .exe (de hecho no llevan extensiones).

Salud

pepsenma

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Ejecutar fichero .exe
« Respuesta #2 en: Lunes 4 de Mayo de 2009, 19:37 »
0
Es normal que te salga "[Error en el paso de los fitcheros]" porque según tu código se ejecuta siempre esa sentencia para el proceso hijo. Supongo que habrás querido poner:

Código: C
  1. if (execl("./progs/","./progs/", NULL) == -1)
  2. {
  3.     write(1,"[Error en el paso de los fitcheros]n",strlen("[Error en el paso de los fitcheros]n");
  4.     exit(0);
  5. }
  6.  


El codigo no se ejecutaria siempre con la sentencia que copie, puesto que la instruccion execl digamos q mata al proceso q esta ejecutando. Ayudado de esto, puse el write justo después de la instrucción y así tenia la certeza que el texto de error solo salia si las cosas iban mal


Además fíjate que a execl() no le pasas ningún fichero a ejecutar, sólo un directorio. Además, el segundo parámetro deben ser los argumentos para el ejecutable. Resulta inútil pasarle la misma ruta que en el primer parámetro.

Disculpa, eso es fallo mio. Pegue una versión antigua y mala. Una vez lo he puesto bien sigue sin funcionar. És muy probable que el error esté aquí, alguien sabria como se llama la instruccion execl para el proposito que estoy exponiendo?

Fíjate también que no has cerrado la llave del switch.

Si bueno, eso es pq me deje de copiar la llave final  :blink:


PD: Por cierto, la ruta que especificas suena a ruta de sistema *IX, que no son Windows y cuyos ejecutables no son .exe (de hecho no llevan extensiones).

El operativo es unix y la carpeta la cree yo llenandola de documentos compilados los cuales lo unico q hacen es sacar un texto por pantalla

Salud[/quote]

Muchas gracias de todos modos