Что-то я туплю совсем… Ситуация такая. Есть большая прога c GTKовым интерфейсом, и в ней при нажатии одной из кнопок отфоркивается новый процесс. Форк пришлось вставить в функцию, и все было бы хорошо, но вот при закрытии приложения выскакивает ошибка от Икса.
Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0
Я не могу понять, что происходит. Вот, удалось смоделировать ситуацию на простейшем примере
#include
#include
int pid=-1;
void spawn_child(){
if(pid = fork()) //parent
return;
else{
gtk_main_quit();
printf("I'm the freaking child!\n");
}
}
static void hello( GtkWidget *widget,
gpointer data ){
spawn_child();
if(pid) //<-- Если это убрать, Hello будет печататься ДВАЖДЫ!!!!! 8-()
g_print ("Hello World\n");
}
static gboolean delete_event( GtkWidget *widget,
GdkEvent *event,
gpointer data ){
g_print ("delete event occurred\n");
return TRUE;
}
static void destroy( GtkWidget *widget,
gpointer data ){
gtk_main_quit ();
}
int main( int argc,
char *argv[] ){
GtkWidget *window;
GtkWidget *button;
gtk_init (&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
g_signal_connect (G_OBJECT (window), "delete_event",
G_CALLBACK (delete_event), NULL);
g_signal_connect (G_OBJECT (window), "destroy",
G_CALLBACK (destroy), NULL);
gtk_container_set_border_width (GTK_CONTAINER (window), 10);
button = gtk_button_new_with_label ("Hello World");
g_signal_connect (G_OBJECT (button), "clicked",
G_CALLBACK (hello), NULL);
g_signal_connect_swapped (G_OBJECT (button), "clicked",
G_CALLBACK (gtk_widget_destroy),
G_OBJECT (window));
gtk_container_add (GTK_CONTAINER (window), button);
gtk_widget_show (button);
gtk_widget_show (window);
gtk_main ();
wait(NULL);
return 0;
}
Если это скомпилировать и запустить, получается окошечко с кнопочкой, при нажатии на кнопочку печатается
teddy@toshiba~/projects/gtk$ gcc button1.c `pkg-config --cflags --libs gtk+-2.0` -o button1
teddy@toshiba~/projects/gtk$ button1
I’m the freaking child!
Hello World
button1: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0.
Но почему?! Такое впечатление, что gtk_main_quit() в ребенке не имеет вообще никакого эффекта, вроде как существуют два окна, но одного при этом не видно…
Как все это у людей делается-то? Help?
Последние комментарии
-
OlegL, 17 декабря 2023 года в 15:00 →
Перекличка
21
-
REDkiy, 8 июня 2023 года в 9:09 →
Как «замокать» файл для юниттеста в Python?
2
-
fhunter, 29 ноября 2022 года в 2:09 →
Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
6
-
Иванн, 9 апреля 2022 года в 8:31 →
Ассоциация РАСПО провела первое учредительное собрание
1
-
Kiri11.ADV1, 7 марта 2021 года в 12:01 →
Логи catalina.out в TomCat 9 в формате JSON
1
DevOps as a Service from Palark

Блин!
Пытаюсь сделать как здесь написано
http://library.gnome.org/devel/gtk-faq/stable/x506.html
то есть, вставляю _exit(0) после
gtk_main_quit();
printf(«I’m the freaking child!\n»);
в детеныше. Даже закомментариваю gtk_main_quit(). В примере сверху ошибка исчезает. А в проекте --не исчезает! Shit. Три дня уже мучаюсь…
ПЫСЫ. Во я, блин, баран!!! :D
Все, проблема решена. _exit(0) — это то, что было нужно. Просто, надо смотреть, куда ее пишешь. Не после return’а же… гыгыгыгы…
Всем спасибо. :)
хм. прикольно :)