2009-10-25 14 views
5

Estoy escribiendo un reproductor de vídeo en Linux y me gustaría para separarlo en 2 procesos:En Linux, ¿podría un proceso representar la GUI de otro proceso?

proceso A. decodificador B. GUI

De esta manera, podría utilizar diferentes lenguajes de programación y cuando una El problema ocurre, es más fácil saber dónde está el problema.

El problema es que podría procesar A renderizar imágenes decodificadas en la superficie de B directamente? No quiero usar algún IPC para enviar B estos datos descodificados porque eso podría ser muy ineficiente.

Respuesta

8

Puede usar la especificación XEmbed, que le permite incrustar una ventana X11 dentro de otra, y pueden ser de procesos diferentes. Esto es lo que suelen hacer otras interfaces de los reproductores multimedia.

Tanto GTK como Qt admiten XEmbed.

+0

¡Muchas gracias! Eso es lo que quiero. – ablmf

1

Mire cómo se implementan mplayer y smplayer. mplayer decodifica y muestra el video, y smplayer es la GUI (opcional).

4

IPC (especialmente una tubería Unix) es mucho más eficiente de lo que piensas y es probablemente el mecanismo adecuado para usar.

Sin embargo, ya que preguntas cómo hacerlo sin IPC (y de análisis sintáctico que esto quiere decir, sin cambios de contexto y copias), sólo tiene que crear un segmento de memoria compartida entre los dos procesos:

fd = shm_open("/my_shmem", O_RDWR| O_CREAT, S_IWUSR); 
if(fd == -1) abort(); 
ftruncate(fd, SHMEM_SIZE); 
p = mmap(NULL, SHMEM_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0); 
if(p == MAP_FAILED) abort() 

Ahora p tiene la dirección de un segmento de memoria compartida compartido por los dos (o más) procesos.

¡Advertencia! el valor numérico de p (dirección virtual de la memoria) puede ser diferente entre los procesos, por lo que si desea poner una lista vinculada en la memoria compartida, por ejemplo, tendría que usar desplazamientos.

Cheers, gby

Cuestiones relacionadas