我有以下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 +
”,但我没有看到“无法打开显示”警告,但我的程序仍未启动。
有谁知道如何解决我的问题?
谢谢。
答案 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_*
等环境变量感到满意不见了。为什么不使用execv
或execvp
,只允许继承父级环境?
答案 2 :(得分:1)
如果您在MyGtkApp
中遇到分段错误,那么您的应用程序就会出错,这与您发布的程序无关。
一些建议:
0
代替NULL
,它是64位平台上的痛苦生成器:至少使用(void *) 0
; 第一个参数(按照惯例)总是程序名,所以:
char *args[] = { "/home/michael/MyGtkApp", "testarg", (void *) 0 };