Что-то я туплю совсем… Ситуация такая. Есть большая прога 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
Блин!
Пытаюсь сделать как здесь написано
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’а же… гыгыгыгы…
Всем спасибо. :)
хм. прикольно :)