TODOPIC

Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: migsantiago en 02 de Marzo de 2014, 01:32:04

Título: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: migsantiago en 02 de Marzo de 2014, 01:32:04
Hola!

Estoy escribiendo un programa que corre algunos hilos que monitorean la conexión de una USB y otras cosas. Cuando la USB está montada, necesito correr una aplicación en Linux y dejarla corriendo por su cuenta.

Esto es fácil de hacer a través de system(), pero el problema con system es que me bloquea el hilo hasta que la aplicación que llamé termine. No quiero esperar a la aplicación, ella y mi programa deberán correr en paralelo. La aplicación es el reproductor VLC.

system("vlc /mnt/usb");

Estuve leyendo y parece que puedo lograrlo con un simple fork(), pero sólo lo he usado en código sin hilos, donde sólo habrá un proceso padre y el hijo. Ahora, si corro un fork() desde mi proceso con varios hilos... ¿se clonan también los hilos? No me importaría usar el fork, pero si me clona los hilos, no funcionaría bien mi programa.

¿Me pueden dar alguna pista con esto?  :undecided:

Edito: Me faltó preguntar también si puedo obtener el PID del VLC para después matarlo cuando ya no me haga falta.

Gracias :)
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: migsantiago en 02 de Marzo de 2014, 11:43:52
Seguí buscando y encontré la forma. Basta con poner un ampersand al final del comando para que bash corra el proceso y system no se bloquee. El proceso se queda corriendo por su cuenta.

system("vlc /mnt/usb --random &");

Y bueno, para matar al proceso usé fuser, pidiendo que mate a cualquiera que esté usando la ruta montada.

system("fuser -km /mnt/usb");

 :mrgreen:
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: PalitroqueZ en 02 de Marzo de 2014, 11:57:15
con pidof también puedes averiguar el PID de un proceso conocido
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: migsantiago en 02 de Marzo de 2014, 13:21:35
con pidof también puedes averiguar el PID de un proceso conocido

Gracias Pedro :)
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: gera en 02 de Marzo de 2014, 14:55:08
Con la funcion exec() haces esto. Lo que hace es "mutar" a tu proceso en uno nuevo. Te dejo unos ejemplos:

http://cortesfernando.blogspot.com.ar/2011/11/procesos-linux-exec-y-fork.html

http://man7.org/linux/man-pages/man3/exec.3.html

Saludos!!
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: migsantiago en 02 de Marzo de 2014, 17:23:43
Con la funcion exec() haces esto. Lo que hace es "mutar" a tu proceso en uno nuevo. Te dejo unos ejemplos:

http://cortesfernando.blogspot.com.ar/2011/11/procesos-linux-exec-y-fork.html

http://man7.org/linux/man-pages/man3/exec.3.html

Saludos!!

Oye Gera, y de lo que preguntaba arriba, si clono un proceso, ¿se clonan todos sus hilos?
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: gera en 03 de Marzo de 2014, 13:17:03
Lo que tendrías que hacer es usar un fork(), en ese caso vas a tener dos instancias idénticas de tu proceso. Podrías conservar uno de ellos como está (el padre), y si te interesa podés terminar sus hilos
http://www.thegeekstuff.com/2012/04/terminate-c-thread/

y el proceso hijo puede mutar al VLC con exec.

Saludos!!
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: migsantiago en 04 de Marzo de 2014, 00:07:37
Lo que tendrías que hacer es usar un fork(), en ese caso vas a tener dos instancias idénticas de tu proceso. Podrías conservar uno de ellos como está (el padre), y si te interesa podés terminar sus hilos
http://www.thegeekstuff.com/2012/04/terminate-c-thread/

y el proceso hijo puede mutar al VLC con exec.

Saludos!!

Interesante, gracias Gera.
Título: Re: Linux - Ejecutar proceso desde C y no esperar terminación
Publicado por: gera en 04 de Marzo de 2014, 01:23:25
Espero que te sirva. Suerte!!