“gtk-WARNING **:无法打开显示:”使用execve在ubuntu上启动Gtk程序时

时间:2010-03-13 09:06:25

标签: c linux gtk

我有以下c程序在ubuntu上启动Gtk程序:

#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 +”,但我没有看到“无法打开显示”警告,但我的程序仍未启动。

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

谢谢。

3 个答案:

答案 0 :(得分: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 :(得分:1)

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

非常错误。按=分隔名称和值,并按NULL args终止列表。

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,只允许继承父级环境?

答案 2 :(得分:1)

如果您在MyGtkApp中遇到分段错误,那么您的应用程序就会出错,这与您发布的程序无关。

一些建议:

  1. 我永远不会使用0代替NULL,它是64位平台上的痛苦生成器:至少使用(void *) 0;
  2. 如果要初始化,则无需指定数组大小;
  3. 第一个参数(按照惯例)总是程序名,所以:

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