我对xopendisplay函数没有什么问题。在学校里,我可以运行程序,当使用xopendisplay(“ip:0”)时它运行得很好,但在家里的本地计算机上,当我运行程序(更改了当前的ip)时得到“分段错误(核心转储)”,但使用empy string xopendisplay(“”)时,它运行得很好。我需要能够使用IP。使用了host+,但没有任何更改。
我的系统是kubuntu 14.04.1:3.16.0-30-generic 40~14.04.1-ubuntu smp thu 2015年1月15日17:43:14 utc
程序代码如下:

#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。在下一行中,您将尝试对结果使用DefaultScreenDefaultScreen定义为

#define DefaultScreen(dpy)  ((dpy)->default_screen)

也就是说,它只是一个宏,它使用第一个参数作为指针。在您的情况下,它确实((0)->default_screen),即它取消了空指针的引用,这将导致您看到的segfault。
另外,关于XOpenDisplay("192.168.0.12:0");-你没有提到你正在尝试连接到另一台电脑,所以,如果是运行应用程序的同一台电脑,请尝试将函数调用为XOpenDisplay("127.0.0.1:0");
好吧,我试着在我的电脑上运行代码,但这个功能对我来说也不起作用。为了找到我在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。现在,displaymanagers是管理xsession的人,所以您需要根据您的dm设置一些选项。
lightdm的解决方案
打开/etc/lightdm/lightdm.conf,并在xserver-allow-tcp=true部分粘贴行[SeatDefaults](您将看到它)。
gdm的解决方案
编辑文件,您会发现
<schema>
<key>security/DisallowTCP</key>
<signature>b</signature>
<default>true</default>
</schema>

/etc/gdm/gdm.schemas更改为true

关于c - 带和不带参数的功能XOpenDisplay,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30514218/

10-12 13:54