«Gtk-WARNING **: невозможно открыть дисплей:» при использовании execve для запуска программы Gtk в Ubuntu - PullRequest
0 голосов
/ 13 марта 2010

У меня есть следующая программа c, которая запускает программу Gtk в 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 +», я не вижу предупреждения «Не удается открыть дисплей», но моя программа все еще не запущена.

Кто-нибудь знает, как решить мою проблему?

Спасибо.

Ответы [ 3 ]

1 голос
/ 13 марта 2010
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;

Мне интересно, почему вы предоставляете программе такую ​​разреженную среду, хотя & ndash; В зависимости от того, как вы сконфигурированы и что используете, Gtk + может быть не совсем доволен отсутствием DBUS_SESSION_BUS_ADDRESS,GTK2_RC_FILES,GTK_IM_MODULE,HOME,LANG*,LC_*,PATH,XDG_* и т. д. Почему бы вам просто не использовать execv или execvp и просто позволить наследовать родительскую среду?

1 голос
/ 13 марта 2010

Если у вас возникла ошибка сегментации в MyGtkApp, ваше приложение содержит ошибки, и это не имеет никакого отношения к опубликованной вами программе.

Некоторые предложения:

  1. Я бы никогда не использовал 0 вместо NULL, это генератор боли на 64-битных платформах: используйте хотя бы (void *) 0;
  2. не нужно указывать размер массива, если вы его инициализируете;
  3. первый аргумент (по соглашению) всегда имя программы, поэтому:

    char *args[] = { "/home/michael/MyGtkApp", "testarg", (void *) 0 };
    
1 голос
/ 13 марта 2010

Я попытался настроить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...