QXcbConnection: Could not connect to display :0

问题描述

最近在搞一个图形化程序的 chroot 环境时,在 chroot 环境内运行图形界
面程序时报了如下错误:

No protocol specified
qt.qpa.screen: QXcbConnection: Could not connect to display :0
Could not connect to any X display.

MoberXterm 中虚拟 X server 的使用

在 MoberXterm 中可以通过点击右上角的 X server 图标来启动一个 X
server
,启动后,鼠标停在上面就会得到一个 DISPLAY 变量的信
,根据这个内容在终端中设定 DISPLAY 变量,在终端的 chroot 环
境中运行图形化程序会弹出一个会话框,程序正常运行。

如果修改了 DISPLAY 变量的值,将会出现与上面一样的报错信息,看
来应该根 DISPLAY 变量有很大关系。

最终定位到的问题

最后在 KDE 图形界面中运行也报了相同的问题,将 strace 放到 chroot 环境
中后,使用 strace 追踪,发现程序启动的时候有查找一个
~/.Xauthority 文件的过程,然而这个文件不存在,有下面的报错信息:

cannot find ~/.Xauthority 

将主机环境中的这个文件拷贝到 chroot 的环境内后重新执行,这次成功
了!

其实这里的图形界面相当于一个 xclient 程序,在 xclient 连接到
xserver 的过程中要进行认证,认证使用 ~/.Xauthority 文件来完
成,这个文件是由 xauth 命令进行管理的。

MoberXterm 中 X server 模拟器并不使用这个认证功能,故而只要我们
设定了正确的 DISPLAY 程序就能正常运行。

鸟哥私房菜中的相关内容

我回想了下我曾经阅读过的 linux 命令行相关书籍,我确定只有《鸟哥的
Linux 私房菜》中有讲 X11,这部分之前没有仔细的研究,直接跳过了。
回去重新读了下,发现 X11 其实挺好玩的。

xserver 负责监控鼠标、键盘等事件,它也负责具体的绘制过程,但是它并
不负责生成绘制的内容。

xclient 负责生成具体的绘制内容,xclient 会将绘制内容传递给 xserver,让
xserver 完成绘制过程,而 xclient 也会监听 xserver 发送的鼠标、键盘事
件,这常常会带来页面内容的改变,xclient 计算完成后将修改的页面内容
继续发给 xserver,xserver 继续显示。

DISPLAY 变量是一个重要的环境变量,我们知道 linux 一般有 7 个 tty,但
是图形界面所在的 tty 一般只有一个,它会独占显示器。

我们可以在其它 tty 中通过设定 DISPLAY 变量来运行 xclient 图形化程序,
运行后你会发现并没有任何弹窗,实际上它会在当前的图形化终端中显
示,当你切回图形化显示 tty 后,你会看到这个程序。

其实也可以直接在终端中显示图形化界面,不过可能与你想的有些区别,
可以访问 使用 awtk fb 项目与 valgrind 检测基于 awtk 开发的 gui 程序中的
内存泄露问题
来查看相关内容。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值