En Linux, ¿podría un proceso representar la GUI de otro proceso?
Pregunta
Estoy escribiendo un reproductor de video en Linux y me gustaría separarlo en dos procesos:
A. proceso decodificador B. GUI
De esta manera, podría usar diferentes lenguajes de programación y cuando surge un problema, es más fácil saber dónde está el problema.
El problema es, ¿podría procesar A renderizar imágenes descodificadas directamente sobre la superficie de B? No quiero usar algún IPC para enviar B estos datos decodificados porque eso podría ser muy ineficiente.
Otros consejos
IPC (especialmente una canalización de Unix) es mucho más eficiente de lo que cree y probablemente sea el mecanismo correcto para usar.
Sin embargo, ya que preguntó cómo hacerlo sin IPC (y lo analizo para que signifique sin copias y cambios de contexto), simplemente puede 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 compartida 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 colocar una lista vinculada en la memoria compartida, por ejemplo, tendrá que usar compensaciones.
Saludos, gby
Mira cómo se implementan mplayer y smplayer. mplayer decodifica y muestra el video, y smplayer es la GUI (opcional).