- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对 XOpenDisplay 函数没有什么问题。在学校我可以运行程序并且在使用 XOpenDisplay("ip:0") 时它运行良好,但是在我在家里的本地机器上运行程序时(更改当前的 ip)出现“段错误(核心转储)”,但是empy string XOpenDisplay("") 它工作正常。我需要能够使用 ip。使用主机 +,但没有任何变化。我的系统是 Kubuntu 14.04.1: 3.16.0-30-generic#40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015
程序代码如下:
#include <X11/Xlib.h>
#include <X11/X.h>
#include <stdio.h>
Display *mydisplay;
Window mywindow;
XSetWindowAttributes mywindowattributes;
XGCValues mygcvalues;
GC mygc;
Visual *myvisual;
int mydepth;
int myscreen;
Colormap mycolormap;
XColor mycolor,mycolor1,dummy;
int i;
main()
{
mydisplay = XOpenDisplay("192.168.0.12:0");
myscreen = DefaultScreen(mydisplay);
myvisual = DefaultVisual(mydisplay,myscreen);
mydepth = DefaultDepth(mydisplay,myscreen);
mywindowattributes.background_pixel = XWhitePixel(mydisplay,myscreen);
mywindowattributes.override_redirect = True;
mywindow = XCreateWindow(mydisplay,XRootWindow(mydisplay,myscreen),
0,0,500,500,10,mydepth,InputOutput,
myvisual,CWBackPixel|CWOverrideRedirect,
&mywindowattributes);
mycolormap = DefaultColormap(mydisplay,myscreen);
XAllocNamedColor(mydisplay,mycolormap,"cyan",&mycolor,&dummy);
XAllocNamedColor(mydisplay,mycolormap,"red",&mycolor1,&dummy);
XMapWindow(mydisplay,mywindow);
mygc = DefaultGC(mydisplay,myscreen);
XSetForeground(mydisplay,mygc,mycolor.pixel);
XFillRectangle(mydisplay,mywindow,mygc,100,100,300,300);
XSetForeground(mydisplay,mygc,mycolor1.pixel);
XSetFunction(mydisplay,mygc,GXcopy);
XSetLineAttributes(mydisplay,mygc,10,LineSolid,CapProjecting,JoinMiter);
XDrawLine(mydisplay,mywindow,mygc,100,100,400,400);
XDrawLine(mydisplay,mywindow,mygc,100,400,400,100);
XFlush(mydisplay);
sleep(10);
XCloseDisplay(mydisplay);
exit(0);
}
我只能猜测需要设置一些东西,但不知道那个选项在哪里。
最佳答案
您应始终检查函数是否成功返回。它不是 Haskell,所有的检查都是由 monad 为你完成的,它是 C。至于你的特殊情况,问题是函数 XOpenDisplay
失败并为您返回 null。在下一行中,您尝试使用 DefaultScreen
结果。 DefaultScreen
定义为
#define DefaultScreen(dpy) ((dpy)->default_screen)
即它只是一个宏,它使用第一个参数作为指针。在你的情况下它确实是 ((0)->default_screen)
,即取消引用空指针,这会导致您看到的段错误。
此外,关于 XOpenDisplay("192.168.0.12:0");
— 您没有提到您正在尝试连接到另一台 PC,因此,如果它是运行该应用程序的同一台计算机,请尝试将该函数调用为 XOpenDisplay("127.0.0.1:0");
UPD: 好的,我尝试在我的 PC 上运行代码,但该功能对我也不起作用。为了找到原因,我在 strace
下启动了代码应用程序,并看到
…
connect(3, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
…
啊哈!因此,应用程序尝试连接到 XServer,但 Xserver 拒绝连接。实际上,默认情况下禁用它是有安全原因的——因此,除非您特别允许,否则没有人会从网络连接到您的 XServer。要使该功能正常工作,您需要使用允许此类连接的选项启动 XServer。现在 DisplayManager 是那些管理 xsessions 的人,所以你需要根据你的 DM 设置一些选项。
lightdm 的解决方案
打开/etc/lightdm/lightdm.conf
, 并粘贴 xserver-allow-tcp=true
行在 [SeatDefaults]
部分(你会看到它)。
gdm 的解决方案
编辑文件 /etc/gdm/gdm.schemas
, 你会发现类似
<schema>
<key>security/DisallowTCP</key>
<signature>b</signature>
<default>true</default>
</schema>
更改 true
至 false
.
关于c - 带参数和不带参数的函数 XOpenDisplay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30514218/
Display XOpenDisplay(0) 和 XOpenDisplay(NULL) 有什么区别? #include struct MwmHints { unsigned long fl
我对 XOpenDisplay 函数没有什么问题。在学校我可以运行程序并且在使用 XOpenDisplay("ip:0") 时它运行良好,但是在我在家里的本地机器上运行程序时(更改当前的 ip)出现“
我有如下代码 bool isValidDisplay() { if (!XOpenDisplay(NULL)) { return false; } return true
谁能向我解释为什么 XOpenDisplay() 不会因为错误的显示名称而失败?只要名称遵循语法约定,它似乎总能成功——即使指定的主机名不存在。 XOpenDisplay() 似乎仅在字符串使用错误语
我安装了 x11vnc 然后执行 x11vnc 但失败了 错误信息如下 $x11vnc -display :0 08/05/2017 19:18:22 x11vnc version: 0.9.13 l
所以我正在开发一些代码,使用 X11 库在 Linux 上与 X-Windows 一起工作。我找到了一些简单的教程,但它们没有详细介绍更多实际用例的最佳实践。 我想知道的一件事是,我应该为每个应用程序
我有一个 *.SO 库,当从应用程序调用时,它会从指定窗口中删除窗口装饰。这是我的代码: #include struct MwmHints { unsigned long flags;
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我正在执行一个 CUDA API 虚拟化项目。该项目基于 QEMU 管理程序。我使用的是最新版本 2.6.0rc3。我已经完成了核心模块,这个问题是关于演示它的。QEMU 2.6.0rc3 有 Ope
现在我觉得自己很愚蠢。我正在尝试在 Qt Creator 中使用 xlib 做一些事情。 我的代码: #include #include int main(int argc, char *argv
本文整理了Java中com.sun.jna.platform.unix.X11.XOpenDisplay()方法的一些代码示例,展示了X11.XOpenDisplay()的具体用法。这些代码示例主要来
我编写了一个程序,该程序在登录后在终端中以 ROOT 权限运行,但在重新启动后调用 XOpenDisplay(NULL) 时失败。该程序通过 rc.local 启动,但似乎无法看到 X11。 我需要
这个问题遵循这个 one .我能够找到该库,但在加载时会引发以下错误 java.lang.UnsatisfiedLinkError: /home/name/Documents/Development/
我是一名优秀的程序员,十分优秀!