• Viernes 26 de Abril de 2024, 13:02

Autor Tema:  Ejecutar una aplicación desde un nuevo hilo creado con fork  (Leído 2480 veces)

sergios_

  • Nuevo Miembro
  • *
  • Mensajes: 20
  • Nacionalidad: es
    • Ver Perfil
    • http://masprogramacionymenosprozac.blogspot.com
Ejecutar una aplicación desde un nuevo hilo creado con fork
« en: Domingo 23 de Noviembre de 2008, 15:35 »
0
Hola a todos,

Quería hacerles una consulta. Estoy desarrollando una aplicación con una interfaz gráfica de usuario que utiliza las librerías Qt. Por otro lado hay una aplicación que gestiona un bus serie de comunicaciones. La idea era que los datos que maneja la interfaz gráfica de la primera aplicación fueran en realidad datos que se reciben y se envían usando la segunda aplicación. Como primera idea se me ocurre que ambas aplicaciones podrían usar una sección de memoria compartida. Podría haber, por tanto, un programa aparte que crease la memoria compartida y después iniciase dos procesos hijos mediante fork. Uno de los hijos ejecuta el código de la primera aplicación y el otro el de la segunda aplicación.

Hasta aquí la idea sonaba bastante bien pero por lo que he leído si utilizo un fork para crear un proceso y después exec para que dicho proceso ejecute el código de un ejecutable ya existente el espacio de direcciones cambia y pierdo la memoria compartida. ¿Cúal sería la forma correcta de hacer algo como lo que estoy planteando?

Si alguien necesita más información puedo tratar de explicar más en detalle alguna parte del problema.

Gracias por adelantado y un saludo.
============================
"Si sale, sale. Si no sale, hay que volver a empezar.
Todo lo demás son fantasías." - Edouard Manet

http]

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Ejecutar una aplicación desde un nuevo hilo creado con fork
« Respuesta #1 en: Domingo 23 de Noviembre de 2008, 17:34 »
0
Hola,

En teoría la razón de ser de la memoria compartida es la de comunicación entre procesos y no deberías tener ningún problema, ya que los identificadores se heredan entre procesos de la misma jerarquía. De todas formas eso que dices yo lo implementaría empleando tuberías para pasar datos entre el backend y el gui con un sencillo protocolo binario, que te va a ser más fácil de depurar y el código te va a quedar más organizado.

Un saludo,

Rubén Moreno

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ejecutar una aplicación desde un nuevo hilo creado con fork
« Respuesta #2 en: Lunes 24 de Noviembre de 2008, 09:17 »
0
Yo que tú lo haría con tuberías (pipes) porque con memoria compartida te vas a volver loco con la concurrencia, y vas a necesitar semáforos o algo parecido para sincronizar los procesos. Hazle caso Ruben3d. Suerte.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Ejecutar una aplicación desde un nuevo hilo creado con fork
« Respuesta #3 en: Lunes 24 de Noviembre de 2008, 21:01 »
0
Yo usaria UNIX Domain Socket para hacer la comunicacion entre los dos programas...
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

sergios_

  • Nuevo Miembro
  • *
  • Mensajes: 20
  • Nacionalidad: es
    • Ver Perfil
    • http://masprogramacionymenosprozac.blogspot.com
Re: Ejecutar una aplicación desde un nuevo hilo creado con fork
« Respuesta #4 en: Martes 25 de Noviembre de 2008, 10:56 »
0
Hola a todos,

Muchas gracias por vuestras respuestas. Teniendo en cuenta vuestros comentarios voy a replantearme si sería mejor utilizar otro tipo de comunicación entre procesos que no sea memoria compartida (pipes o sockets por ejemplo).

De todas formas mi mayor duda no era esa, sino buscar la forma de que una aplicación cree un proceso hijo con fork y después ese hijo ejecute el código de otro ejecutable. Los ejemplos que he visto hacen esto usando una llamada a exec, pero por lo que he leído al hacer exec se perdería por ejemplo la memoria compartida que se hubiera definido previamente y no sé si puede afectar también a otros tipos de comunicación entre procesos. Por eso preguntaba si había otras formas de hacerlo. La razón de tener la gui y las comunicaciones en dos aplicaciones distintas es que estas aplicaciones puedan ser desarrolladas por programadores distintos, e incluso usando lenguajes distintos (C puro por un lado, C++ por el otro).

Gracias de nuevo y un saludo.
============================
"Si sale, sale. Si no sale, hay que volver a empezar.
Todo lo demás son fantasías." - Edouard Manet

http]

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Ejecutar una aplicación desde un nuevo hilo creado con fork
« Respuesta #5 en: Martes 25 de Noviembre de 2008, 11:33 »
0
Cita de: "sergios_"
hacen esto usando una llamada a exec, pero por lo que he leído al hacer exec se perdería por ejemplo la memoria compartida que se hubiera definido previamente
No termino de entender muy bien para qué quieres mantener las comunicaciones después de hacer execve(). Ten en cuenta que los descriptores de fichero que tuvieras no cambian, siguen siendo los mismos aunque la imagen del proceso sea otra. Aquí te dejo una explicación de qué se hereda y qué no del proceso llamante:

http://www.manpagez.com/man/2/execve/

Saludos.

Ruben3d

  • Miembro HIPER activo
  • ****
  • Mensajes: 710
  • Nacionalidad: es
    • Ver Perfil
    • Web personal
Re: Ejecutar una aplicación desde un nuevo hilo creado con fork
« Respuesta #6 en: Martes 25 de Noviembre de 2008, 12:43 »
0
Puedes mantener la comunicación por tuberías tras lanzar el proceso con exec. ¿Cómo crees que funciona la propia shell, cuando haces llamadas del tipo 'cat archivo | grep "hola"'? En ese caso concreto lo que se hace es redirigir stdin y stdout a tuberías que heredan los procesos creados con exec desde los fork.

Un saludo,

Rubén

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Ejecutar una aplicación desde un nuevo hilo creado con fork
« Respuesta #7 en: Martes 25 de Noviembre de 2008, 20:40 »
0
Aqui hay un ejemplo muy bueno con fork()
No importa si lo haces con pipes o sockets... cada proceso ejecutado tendra memoria independiente.
Lo mas facil seria usar, ya sea por sockets o por pipes, un sistema donde pases como argumento a los procesos ejecutados toda la informacion que necesites.

Otra forma de hacer eso es usar un metodo tipo "plugins" tal como lo hace Firefox (por ejemplo).
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.