【问题标题】:Why doesn't XOpenDisplay() fail with bad display names为什么 XOpenDisplay() 不会因显示名称错误而失败
【发布时间】:2014-06-15 13:15:59
【问题描述】:

谁能向我解释为什么 XOpenDisplay() 不会因显示名称错误而失败?只要名称遵循语法约定,它似乎总是成功 - 即使指定的主机名不存在。 XOpenDisplay() 似乎只有在字符串使用错误的语法时才会失败,例如

d = XOpenDisplay("foobar");       // fails - presumably because of bad syntax in string
d = XOpenDisplay("foobar:0.0");   // works - although there is no host named "foobar"

当指定一个不存在的主机名时,XOpenDisplay() 似乎回退到 $DISPLAY。那是应该的吗?我在 Xlib 文档中没有找到任何关于这些后备的信息。如果行为正确,有没有办法检查返回的显示是否真的将我连接到“foobar:0.0”,或者它是否只是 $DISPLAY 的后备?

【问题讨论】:

  • // works。不适合我。
  • 你是对的,这似乎并不是在所有 Linux 上都会发生。我古老的 openSUSE 安装总是以错误的显示名称失败,即它的行为与预期的一样。但是,我安装的 Ubuntu 12.04 LTS 和 Linux Mint Maya 都显示了我上面介绍的行为。
  • 您可能在某处拥有一个包罗万象的 DNS。
  • 那么我该如何检查是否是这种情况?如果是这种情况,我当然不是故意这样做的,但是错误行为出现在两个完全不同的 Linux 版本上的事实恰恰说明了错误配置。但如果你告诉我去哪里看,我可以检查一下。我已经检查了 /etc/hosts 但我唯一修改的是将 NetBIOS 名称分配给我网络中不同机器的固定 IP 地址。没有别的了。
  • 从 shell 尝试类似 'host foobar' 或 'ping foobar' 之类的东西。

标签: c unix x11


【解决方案1】:

这似乎是相当弱的行为,但http://tronche.com/gui/x/xlib/display/opening.html 说:

显示名称的编码和解释是实现 依赖。

所以看来这种“解释”是允许的。

要判断是否打开了默认显示,您可以尝试:

d_default = XOpenDisplay(NULL);
d = XOpenDisplay("foobar:0.0");
if (!d || d == d_default) {
  // foobar:0.0 was not opened.
}

如果这不起作用,因为 d 和 d_default 即使引用相同的硬件也是不同的,您可以尝试比较 _XDisplay 结构的字段而不是返回的指针,这些指针显然指向不同的结构在某处必须具有相似的数据,因为它们引用相同的硬件。有关可能性,请参阅以下参考资料,但最简单的(如果可行的话)可能是查看 d->fd == d_default->fd 是否。

参考:http://xwindow.angelfire.com/page28.html

【讨论】:

  • 我试过了,但有趣的是,XOpenDisplay(NULL) 返回的指针与 XOpenDisplay("foobar:0.0") 不同,尽管它们显然连接到同一个 X 服务器。
  • 嗯,但这仍然不能解决“foobar:0.0”实际上可能是默认 X 服务器的名称的问题...检查“foobar:0.0”对 $DISPLAY 也不是一个很好的解决方案,因为 $DISPLAY 主要包含类似 ":0" 的内容。因此,必须以某种方式获取默认 X 服务器的名称,然后将其与此进行比较。我不确定,但是否可以在 /etc/hosts 中为当前机器分配多个主机名?然后我们会遇到更多问题来确定给定的服务器名称是有效还是垃圾......
【解决方案2】:

我所知道的强制连接到特定显示器的唯一方法是将所需的显示名称粘贴到环境中:

setenv("DISPLAY", "foobar:0.0", 1);
d = XOpenDisplay(0);

这通常也是可取的,因为正确的显示名称也会传播到任何启动的子进程,但如果您想避免这种情况,您可以记录旧的 $DISPLAY 并在之后恢复它。

【讨论】:

  • 试过了,没有什么不同。如果 $DISPLAY 已设置为某个不存在的幻想主机名,XOpenDisplay() 仍然会成功。
猜你喜欢
  • 2016-06-25
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多