Autor Tema: Linux - Ejecutar proceso desde C y no esperar terminación  (Leído 3948 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Linux - Ejecutar proceso desde C y no esperar terminación
« 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 :)
« Última modificación: 02 de Marzo de 2014, 01:37:06 por migsantiago »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #1 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:

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #2 en: 02 de Marzo de 2014, 11:57:15 »
con pidof también puedes averiguar el PID de un proceso conocido
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #3 en: 02 de Marzo de 2014, 13:21:35 »
con pidof también puedes averiguar el PID de un proceso conocido

Gracias Pedro :)

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #4 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!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #5 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?

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #6 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!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #7 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.

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Linux - Ejecutar proceso desde C y no esperar terminación
« Respuesta #8 en: 04 de Marzo de 2014, 01:23:25 »
Espero que te sirva. Suerte!!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein