C 为什么';t XOpenDisplay()失败,显示名称不正确

C 为什么';t XOpenDisplay()失败,显示名称不正确,c,unix,x11,C,Unix,X11,有人能向我解释为什么XOpenDisplay()不会因错误的显示名称而失败吗?只要名称遵循语法约定,它似乎总是成功的——即使指定的主机名不存在。XOpenDisplay()似乎只有在字符串使用错误语法时才会失败,例如 d = XOpenDisplay("foobar"); // fails - presumably because of bad syntax in string d = XOpenDisplay("foobar:0.0"); // works - although

有人能向我解释为什么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的回退?

这看起来确实是一种很弱的行为,但表示:

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

因此,这种“解释”似乎是允许的

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

d_default = XOpenDisplay(NULL);
d = XOpenDisplay("foobar:0.0");
if (!d || d == d_default) {
  // foobar:0.0 was not opened.
}
如果由于
d
d\u default
不同(即使引用相同的硬件)而无法正常工作,则可以尝试比较
\u XDisplay
结构的字段,而不是返回的指针,它们显然指向不同的结构,这些结构的某些地方必须有相似的数据,因为它们引用相同的硬件。请参阅以下参考资料以了解可能性,但最简单的方法(如果可行)可能是查看
d->fd==d\u default->fd


参考资料:

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

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

这通常也是可取的,因为正确的显示名称也会传播到任何已启动的子进程,不过如果您想避免这种情况,您可以记录旧的
$display
,然后将其还原。

我尝试过,但有趣的是,XOpenDisplay(NULL)返回的指针与XOpenDisplay(“foobar:0.0”)不同虽然它们显然连接到同一个X服务器。嗯,但这仍然不能解决“foobar:0.0”可能实际上是默认X服务器名称的问题。。。对$DISPLAY检查“foobar:0.0”也不是一个好的解决方案,因为$DISPLAY主要包含“:0”之类的内容。因此,必须以某种方式获取默认X服务器的名称,然后将其与此进行比较。我不确定,但是否可以在/etc/hosts中为当前机器分配几个主机名?然后,我们将有更多的问题来确定给定的服务器名称是有效的还是垃圾的…
//works
。对我来说不是。你说得对,它似乎不会发生在所有的利努克斯。我以前安装的openSUSE总是以错误的显示名称失败,也就是说,它的行为与人们预期的一样。然而,我安装的Ubuntu12.04 LTS和Linux Mint Maya都显示了我上面介绍的行为。你可能在某个地方有一个全包DNS。那么我如何检查是否是这样?如果是这样的话,我当然没有故意这么做,但在两个完全不同的Linux版本上出现错误行为的事实恰恰说明这是一种错误配置。但如果你告诉我去哪里找,我可以查一下。我已经签出了/etc/hosts,但我唯一修改的是将NetBIOS名称分配给网络中不同机器的固定IP地址。没有别的。从shell中尝试类似“主机foobar”或“ping foobar”的操作。尝试后没有任何区别。如果$DISPLAY已设置为某个不存在的虚拟主机名,则XOpenDisplay()仍会成功。