nixp.ru v3.0

22 октября 2017,
воскресенье,
21:56:39 MSK

DevOps с компанией «Флант»
Uncle Theodore написал 14 февраля 2008 года в 00:20 (635 просмотров) Ведет себя неопределенно; открыл 58 тем в форуме, оставил 1537 комментариев на сайте.

Что-то я туплю совсем… Ситуация такая. Есть большая прога 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?

Uncle Theodore

Блин!

Пытаюсь сделать как здесь написано

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’а же… гыгыгыгы…

Всем спасибо. :)

Code Monkey

хм. прикольно :)