2010-03-13 26 views
0

推出一个GTK程序我有在Ubuntu启动一个GTK程序下面的C程序:“GTK的WARNING **:无法打开显示:”使用execve的时候在Ubuntu

#include <unistd.h> 

int main(int argc, const char* argv[]) 
{ 
    char *args[2] = { "testarg", 0 }; 
    char *envp[1] = { 0 }; 
    execve("/home/michael/MyGtkApp",args,envp); 
} 

我得到“Gtk-WARNING **: cannot open display: “我的程序没有启动。

我试过设置char *envp[1] = {"DISPLAY:0.0"};并执行'xhost +',我没有看到'无法打开显示'警告,但我的程序仍然没有启动。

有谁知道如何解决我的问题?

谢谢。

回答

1
char *envp[1] = {"DISPLAY:0.0"}; 

非常错误的独立的名称和值由=,并终止该列表由NULLargs

char *envp[2] = {"DISPLAY=:0.0", 0}; 

或更好的是,不要硬编码显示器,并使用Xauthority。

char *display = 0, *xauthority = 0; 
char *envp[3] = {0}; 
asprintf(&display, "DISPLAY=%s", getenv("DISPLAY")); 
asprintf(&xauthority, "XAUTHORITY=%s", getenv("XAUTHORITY")); 
envp[0] = display; 
envp[1] = xauthority; 

取决于你如何你配置和使用什么我在想为什么你给该节目稀疏的环境中,虽然–,GTK +可能无法与DBUS_SESSION_BUS_ADDRESS,GTK2_RC_FILES,GTK_IM_MODULE,HOME,LANG*,LC_*,PATH,XDG_*等环境变量完全满意不见了。你为什么不使用execvexecvp,只允许继承父级环境?

1

我试着设置envp,并尝试启动我的应用程序。

char *envp[2] = { (char*)"DISPLAY=:0.0", 0 }; 

但我最终分段错误(我的程序运行正常,当我通过命令提示符启动它。

(gdb) bt 
#0 0x007e5f4e in g_main_context_prepare() from /lib/libglib-2.0.so.0 
#1 0x007e6351 in ??() from /lib/libglib-2.0.so.0 
#2 0x007e6b9f in g_main_loop_run() from /lib/libglib-2.0.so.0 
#3 0x0041b419 in gtk_main() from /usr/lib/libgtk-x11-2.0.so.0 
#4 0x08049191 in main (argc=1, argv=0xbffffed4) 
    at main.c:471 
1

如果您在MyGtkApp中遇到了分段错误,那么您的应用程序有问题,这与您发布的程序无关。

几点建议:

  1. 我永远不会使用0代替NULL,它是在64个平台上的疼痛产生:使用至少(void *) 0;
  2. 如果您正在初始化它,则不需要指定数组大小;
  3. 第一个参数是(按照约定)总是节目名称,所以:

    char *args[] = { "/home/michael/MyGtkApp", "testarg", (void *) 0 }; 
    
+0

只要原型是正确的和可变参数不使用,我不明白为什么' 0'而不是'NULL'会是一个问题。国际海事组织使用NULL的最佳理由是因为它在C中更具惯用性。 – ephemient 2010-03-13 17:10:45

相关问题