2010-03-13 25 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

相關問題