PC终端执行开发板上的图形界面程序时出错:Gtk-WARNING **: cannot open display:

来源:互联网 发布:朱文臣 的网络与 编辑:程序博客网 时间:2024/05/16 03:14

场景

root@NanoPi2:/home/fa/Documents/opencv-demo# ./demo (edges:1685): Gtk-WARNING **: cannot open display: 

按照网上说明添加display如下:

root@NanoPi2:/home/fa/Documents/opencv-demo# export DISPLAY=:0.0root@NanoPi2:/home/fa/Documents/opencv-demo# ./demo No protocol specified(edges:1671): Gtk-WARNING **: cannot open display: :0.0

xhost + 之类的也没用。后来参考此篇说法明白了原因:

因为Xserver默认情况下不允许别的用户的图形程序的图形显示在当前屏幕上. 如果需要别的用户的图形显示在当前屏幕上, 则应以当前登陆的用户, 也就是切换身份前的用户执行如下命令。

因此,我直接切换到当前图形界面的用户下,执行程序是OK的,

root@NanoPi2:/home/fa/Documents/opencv-demo# su faroot@NanoPi2:/home/fa/Documents/opencv-demo# ./demook starting demo

按上述说法,在此账户下输入如下命令:

fa@NanoPi2:~/Documents/opencv-demo$ xhost +access control disabled, clients can connect from any hostfa@NanoPi2:~/Documents/opencv-demo$ su rootPassword: root@NanoPi2:/home/fa/Documents/opencv-demo# ./demo ok starting demo

在转回root用户下也可执行了。试了下如下:

root@NanoPi2:/home/fa/Documents/opencv-demo# su fafa@NanoPi2:~/Documents/opencv-demo$ xhost -access control enabled, only authorized clients can connect

综上所述:在当前图形界面的账户里如果你使能了access control功能,那么只有允许了的用户才能启动GUI程序显示到当前的屏幕,否则由于无法显示而启动失败。

总结

参考文章:Linux在远程X Server上显示图形界面

一、远程的X Server

X Window System由客户端和服务端组成,服务端X Server负责图形显示,而客户端库**X
Client**根据系统设置的DISPLAY环境变量,将图形显示请求发送给相应的X Server。
X Server是Gnome等桌面环境的基础,一个桌面环境通常包含了XDM(X Display Manager,通常的图形化用户登录界面就属于XDM)、窗口管理器(X Server显示的图形是没有“窗口”边框的,通过替换窗口管理器可以实现不同的视觉效果,比如实现3D效果的Compiz)等组件。

进行图形显示并不需要桌面环境,只要有X Server即可。

依上述说明:

  1. 首先要在远程要显示图形的机子(简称图形机)上打开X erver服务。两种方法启动:startx和xinit,命令参数一样的

    startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]eg: xinit /usr/bin/xterm -- :1 &

    选项分为两个部分,以符号 “–”为界,前面是客户端选项,后面是X Server选项。客户端程序必须是绝对路径(/usr/bin/xterm),如果一个客户端也没有,X sever就会自行退出,所以开机时默认会启动一个客户端。服务端默认X :0
    display:用于设置客户端远程连接该图形服务器的DISPLAY名称
    启动完成后查看进程可看到

    /usr/bin/Xorg :0 -nr -verbose -audit 4 -auth /var/run/gdm/auth-for-gdm-Ikd3i7/database -nolisten tcp vt1
  2. 授权远程机访问X server

    xhost [[+-]name ...]

    直接xhost + 允许所有访问,xhost -禁止所有访问,xhost可以查询当前访问列表信息

  3. 在客户端配置显示机
    指定在哪个图形机上显示通用环境变量DISPLAY指定,格式如下:

    export DISPLAY = [Address]:{NumA}.{NumB}

    其中Address为X Server地址,如果Address为空,则通过域套接字连接到本地的X Server。

    NumA为display number,这与传递给xinit的display选项对应,这个display number为X Server的监听端口号送去6000。因此,实际上此时B机器上的X Server在监听6001端口,可以使用netstat命令验证。

    NumB为screen number(可能是多显示器的情况下指定显示在哪个显示器,未验证),通常情况下都为0.

二、SSH隧道转发

图形机上的SSH服务开启了X11转发功能。
配置文件/etc/ssh/sshd_configX11Forwarding yes

在ssh远程登录时加上-X选项如下:

ssh -X 192.168.9.135

启动一个图形程序测试下。

0 0