$ ./a.out
Proceso Hijo PID: 23889
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Processo Padre comete Filicidio
Para listar procesos en ejecucion: ps -A
Para matar un proceso: kill -9 PID (PID es el identificador del proceso)
Otro metodo: pkill firefox (Mata directamente sin necesidad del PID)
Otro metodo: killall firefox (Mata todos los procesos de la aplicacion)
$ ./a.out
Proceso Padre PID: 24397
Proceso Hijo PID: 24398
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Hola mundo
Processo Padre comete Filicidio
La idea es desde un programa en C++ lanzar otro programa que reproduce un video, y en un momento determinado, en base a señales externas que me entran por un GPIO, puedo necesitar lanzar otro video, pero parando el actual si todavía está reproduciéndose.
CitarLa idea es desde un programa en C++ lanzar otro programa que reproduce un video, y en un momento determinado, en base a señales externas que me entran por un GPIO, puedo necesitar lanzar otro video, pero parando el actual si todavía está reproduciéndose.
Tal ves seria mejor si explicas como lo inicias a ese video, si ejecutas desde C++ una linea de comando, o lo haces directamente desde C++, etc. Ya que el codigo es de python el que pasaste.
Podrias tratar de buscar el PID respecto al nombre del proceso, hay funciones por internet que lo hacen. Luego teniendo el PID procedes a matarlo.
Lo que si tenes que asegurarte que no este abierto mas de una ves.
Entonces tal ves el fork te pueda servir. Lo que si vas a tener que diferencia luego del fork cual es tu proceso padre e hijo. Asi como lo hizo tsk
https://stackoverflow.com/questions/13557853/how-to-start-a-executable-within-a-c-program-and-get-its-process-id-in-linux
Lo que entiendo es que quieres es cerrar una aplicación que está corriendo en el sistema pero no te importa tener mayor control sobre ella. Para ello basta lo que ya AcoranTf mencionó, pkill o killall te permiten matar todos los procesos con el nombre que indiques, así tengas una, dos o más instancias del mismo proceso con esos comandos cerrarás todas.
Sigo leyendo cosas, y mi duda es que comando usar para llamar al programa externo desde C++. Parece que hay tres formas de hacerlo.
1.- system
2.- popen
3.- fork + exec
Tendré que conectar el Raspberry y probarlo todo, es un proyecto que lo tenía medio dormido y ya toca retomarlo, pero ahora con una solución más racional.
Me ha parecido que incluso podría lanzar la reproducción de los videos en ventanas, o poder mezclar la reproducción de un video con texto.
Lo que entiendo es que quieres es cerrar una aplicación que está corriendo en el sistema pero no te importa tener mayor control sobre ella. Para ello basta lo que ya AcoranTf mencionó, pkill o killall te permiten matar todos los procesos con el nombre que indiques, así tengas una, dos o más instancias del mismo proceso con esos comandos cerrarás todas.
Ahora, la función system() devuelve un entero que, generalmente, corresponde al código de salida devuelto por el comando que ejecutaste (
Es decir la funcion system es bloqueante, y unicamente va a avanzar de alli luego de que esta salga o se detenga. Esto quiere decir que en el mismo programa no vas a poder iniciar y detener el proceso.
$ ./a.out
4755
0 - Iniciar VLC
1-Detener VLC
0
Master Created subprocess
4756
----------------
4755
4756
4755
0 - Iniciar VLC
1-Detener VLC
VLC media player 2.1.6 Rincewind (revision 2.1.6-0-gea01d28)
[0x6f9118] main libvlc: Ejecutar vlc con la interfaz predeterminada. Use «cvlc» para usar vlc sin interfaz.
1
Killing Process 4756
0 - Iniciar VLC
1-Detener VLC
1
Killing Process 4756
0 - Iniciar VLC
1-Detener VLC
0
Master Created subprocess
4765
----------------
4755
4765
4755
0 - Iniciar VLC
1-Detener VLC
VLC media player 2.1.6 Rincewind (revision 2.1.6-0-gea01d28)
[0x745118] main libvlc: Ejecutar vlc con la interfaz predeterminada. Use «cvlc» para usar vlc sin interfaz.
1
Killing Process 4765
0 - Iniciar VLC
1-Detener VLC
^C
system si es bloqueante, pero puedes agregar el operador & al comando que quieres ejecutar para que corra en "background". Considero que system es más que suficiente si solo requieres iniciar/detener una aplicación.Código: C
¿El reproductor que pretendes iniciar/cerrar es una aplicación propia o algún reproductor ya existente?
No veo cual es el problema, aunque system bloquee, no bloquea el programa principal. v
No entiendo esto. ¿ que es lo que bloquea system ?, ¿ si lanzo un programa con system, el programa principal sigue funcionando aunque no haya terminado el programa llamado ?.
El programa principal debe de seguir su curso, no se puede quedar parado hasta que termine el programa llamado (reproductor de video), eso no me serviría.
Padre Hijo
''
''
''fork()
''==========
'' ''
'' ''
'' ''
'' ''
'' ''
'' ''
'' ''
'' ''
V V
El reproductor de video es un programa mío en C++. Cuando lo lance, el programa principal debe de seguir funcionando, no puede quedar bloqueado hasta que termine el reproductor de video.
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
$ ./signals
Presiona Ctrl+C para terminar el programa
^CAcabas de presionar Ctrl+C, entonces Adios
El fork hace una copia del programa y lo pone en otro proceso hijo, por lo que tendrías dos programas similares corriendo en paralelo, así que aunque system o cualquier otro bloquee, este no va a producir ningún efecto en el flujo del programa padre.
Así que puedes reescribir los manejadores para algunos de las señales (SIGUSR1, SIGUSR2) para que detenga la ejecución del video para que le de la oportunidad de leer algún valor que otro programa le envíe a través de una tubería para que cambie de video o que simplemente detenga la ejecución del mismo.
Por lo tanto puedes tener dos programas totalmente independientes, simplemente el programa que verifica el estado de las entradas le va a enviar las señales adecuadas al proceso del reproductor de vídeo, para que se detenga unos momentos a leer algo que le estas enviando, así te evitas el dichoso fork() y al no tener que cerrarse el reproductor de video podrías pensar en realizar transiciones más complejas(entre videos) de lo que podrías hacer con sólo cerrar y abrir de nuevo la aplicación.
------
Añado que aparentemente puedes enviar datos usando sigqueue. Nunca lo había visto pero podrías ser también prometedor
http://man7.org/linux/man-pages/man3/sigqueue.3.html