在Linux上,进程是否可以呈现另一个进程的GUI?

时间:2009-10-25 08:53:14

标签: linux video x11

我正在Linux上编写一个视频播放器,我想把它分成两个过程:

一个。解码过程 B. GUI

通过这种方式,我可以使用不同的编程语言,当问题发生时,更容易知道问题出在哪里。

问题是,可以直接处理A渲染解码图像到B的表面吗?我不想使用某些IPC来发送B这些解码数据,因为这可能是非常低效的。

3 个答案:

答案 0 :(得分:8)

您可以使用XEmbed规范,它允许您将一个X11窗口嵌入另一个窗口,它们可能来自不同的进程。这就是其他媒体播放器通常所做的事情。

GTK和Qt都支持XEmbed。

答案 1 :(得分:4)

IPC(尤其是Unix管道)比你想象的要高效得多,它可能是正确的使用机制。

但是,既然你问过如何在没有IPC的情况下做到这一点(我将其解析为没有上下文切换和副本),你可以简单地在两个进程之间创建一个共享内存段:

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()

现在p具有两个(或更多)进程共享的共享内存段的地址。

警告! p(内存的虚拟地址)的数值在进程之间可能不同,因此如果要将链表放在共享内存中,则必须使用偏移量。

干杯, GBY

答案 2 :(得分:1)

看看如何实现mplayer和smplayer。 mplayer解码并显示视频,而smplayer是(可选)GUI。