带有和不带参数的XOpenDisplay函数

时间:2015-05-28 18:19:05

标签: c linux xlib

我对XOpenDisplay功能没什么问题。在学校我可以运行程序,它在使用XOpenDisplay(" ip:0")时效果很好,但在我运行程序时在家里的本地机器上(当前更改了ip)得到了#34;分段错误(核心转储)",但使用empy字符串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);
}

我只能猜测需要设置一些内容,但不知道该选项在哪里。

1 个答案:

答案 0 :(得分: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:好吧,我试图在我的电脑上运行代码,这个功能对我也没有用。要找到我在strace app下启动代码并查看

的原因
…
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。现在DisplayManagers是管理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