Blame docs/faq/html/x496.html

Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>Why does this strange 'x io error' occur when I
Packit Service fb6fa5
fork() in my GTK+ app? [GTK 2.x]
Packit Service fb6fa5
>
Packit Service fb6fa5
NAME="GENERATOR"
Packit Service fb6fa5
CONTENT="Modular DocBook HTML Stylesheet Version 1.79">
Packit Service fb6fa5
REL="HOME"
Packit Service fb6fa5
TITLE="GTK+ FAQ"
Packit Service fb6fa5
HREF="book1.html">
Packit Service fb6fa5
REL="UP"
Packit Service fb6fa5
TITLE="Development with GTK+: general questions"
Packit Service fb6fa5
HREF="c466.html">
Packit Service fb6fa5
REL="PREVIOUS"
Packit Service fb6fa5
TITLE="What's an easy way to run a function in the thread with
Packit Service fb6fa5
the main loop? [GTK 2.x]"
Packit Service fb6fa5
HREF="x490.html">
Packit Service fb6fa5
REL="NEXT"
Packit Service fb6fa5
TITLE="Why don't the contents of a button move when the button
Packit Service fb6fa5
is pressed? Here's a patch to make it work that way... [GTK 2.x]"
Packit Service fb6fa5
HREF="x509.html">
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="SECT1"
Packit Service fb6fa5
BGCOLOR="#FFFFFF"
Packit Service fb6fa5
TEXT="#000000"
Packit Service fb6fa5
LINK="#0000FF"
Packit Service fb6fa5
VLINK="#840084"
Packit Service fb6fa5
ALINK="#0000FF"
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="NAVHEADER"
Packit Service fb6fa5
>
Packit Service fb6fa5
SUMMARY="Header navigation table"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
CELLPADDING="0"
Packit Service fb6fa5
CELLSPACING="0"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
COLSPAN="3"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
>GTK+ FAQ
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="10%"
Packit Service fb6fa5
ALIGN="left"
Packit Service fb6fa5
VALIGN="bottom"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x490.html"
Packit Service fb6fa5
ACCESSKEY="P"
Packit Service fb6fa5
><<< Previous
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="80%"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
VALIGN="bottom"
Packit Service fb6fa5
>Development with GTK+: general questions
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="10%"
Packit Service fb6fa5
ALIGN="right"
Packit Service fb6fa5
VALIGN="bottom"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x509.html"
Packit Service fb6fa5
ACCESSKEY="N"
Packit Service fb6fa5
>Next >>>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
ALIGN="LEFT"
Packit Service fb6fa5
WIDTH="100%">
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="SECT1"
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="SECT1"
Packit Service fb6fa5
>
Packit Service fb6fa5
NAME="AEN496"
Packit Service fb6fa5
>Why does this strange 'x io error' occur when I
Packit Service fb6fa5
Packit Service fb6fa5
CLASS="LITERAL"
Packit Service fb6fa5
>fork()
Packit Service fb6fa5
> in my GTK+ app? 
Packit Service fb6fa5
CLASS="EMPHASIS"
Packit Service fb6fa5
>[GTK 2.x]
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>This is not really a GTK+ problem, and the problem is
Packit Service fb6fa5
not related to 
Packit Service fb6fa5
CLASS="LITERAL"
Packit Service fb6fa5
>fork()
Packit Service fb6fa5
> either. If the 'x io
Packit Service fb6fa5
error' occurs then you probably use the 
Packit Service fb6fa5
CLASS="LITERAL"
Packit Service fb6fa5
>exit()
Packit Service fb6fa5
> function
Packit Service fb6fa5
in order to exit from the child process.
Packit Service fb6fa5
>
Packit Service fb6fa5
>When GDK opens an X display, it creates a socket file
Packit Service fb6fa5
descriptor. When you use the 
Packit Service fb6fa5
CLASS="LITERAL"
Packit Service fb6fa5
>exit()
Packit Service fb6fa5
>
Packit Service fb6fa5
function, you implicitly close all the open file descriptors,
Packit Service fb6fa5
and the underlying X library really doesn't like this.
Packit Service fb6fa5
>
Packit Service fb6fa5
>The right function to use here is
Packit Service fb6fa5
Packit Service fb6fa5
CLASS="LITERAL"
Packit Service fb6fa5
>_exit()
Packit Service fb6fa5
>.
Packit Service fb6fa5
>
Packit Service fb6fa5
>Erik Mouw contributed the following code example to
Packit Service fb6fa5
illustrate handling fork() and exit().
Packit Service fb6fa5
>
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
BGCOLOR="#E0E0E0"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="PROGRAMLISTING"
Packit Service fb6fa5
>/*-------------------------------------------------------------------------
Packit Service fb6fa5
 * Filename:      gtk-fork.c
Packit Service fb6fa5
 * Version:       0.99.2
Packit Service fb6fa5
 * Copyright:     Copyright (C) 1999, Erik Mouw
Packit Service fb6fa5
 * Author:        Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
Packit Service fb6fa5
 * Description:   GTK+ fork example
Packit Service fb6fa5
 * Created at:    Thu Sep 23 21:37:55 1999
Packit Service fb6fa5
 * Modified by:   Erik Mouw <J.A.K.Mouw@its.tudelft.nl>
Packit Service fb6fa5
 * Modified at:   Thu Sep 23 22:39:39 1999
Packit Service fb6fa5
 * Modified by:   Tony Gale <gale@gtk.org>
Packit Service fb6fa5
 * Modified at:   Wed Jan 14 12:38:00 2004
Packit Service fb6fa5
 *-----------------------------------------------------------------------*/
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Compile with:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * cc -o gtk-fork gtk-fork.c `pkg-config gtk+-2.0 --cflags --libs`
Packit Service fb6fa5
 *
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include <stdio.h>
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <signal.h>
Packit Service fb6fa5
#include <sys/types.h>
Packit Service fb6fa5
#include <sys/wait.h>
Packit Service fb6fa5
#include <unistd.h>
Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
Packit Service fb6fa5
void sigchld_handler(int num)
Packit Service fb6fa5
{
Packit Service fb6fa5
  sigset_t set, oldset;
Packit Service fb6fa5
  pid_t pid;
Packit Service fb6fa5
  int status, exitstatus;
Packit Service fb6fa5
Packit Service fb6fa5
  /* block other incoming SIGCHLD signals */
Packit Service fb6fa5
  sigemptyset(&set);
Packit Service fb6fa5
  sigaddset(&set, SIGCHLD);
Packit Service fb6fa5
  sigprocmask(SIG_BLOCK, &set, &oldset);
Packit Service fb6fa5
Packit Service fb6fa5
  /* wait for child */
Packit Service fb6fa5
  while((pid = waitpid((pid_t)-1, &status, WNOHANG)) > 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if(WIFEXITED(status))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  exitstatus = WEXITSTATUS(status);
Packit Service fb6fa5
Packit Service fb6fa5
	  fprintf(stderr, 
Packit Service fb6fa5
		  "Parent: child exited, pid = %d, exit status = %d\n", 
Packit Service fb6fa5
		  (int)pid, exitstatus);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else if(WIFSIGNALED(status))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  exitstatus = WTERMSIG(status);
Packit Service fb6fa5
Packit Service fb6fa5
	  fprintf(stderr,
Packit Service fb6fa5
		  "Parent: child terminated by signal %d, pid = %d\n",
Packit Service fb6fa5
		  exitstatus, (int)pid);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else if(WIFSTOPPED(status))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  exitstatus = WSTOPSIG(status);
Packit Service fb6fa5
Packit Service fb6fa5
	  fprintf(stderr,
Packit Service fb6fa5
		  "Parent: child stopped by signal %d, pid = %d\n",
Packit Service fb6fa5
		  exitstatus, (int)pid);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  fprintf(stderr,
Packit Service fb6fa5
		  "Parent: child exited magically, pid = %d\n",
Packit Service fb6fa5
		  (int)pid);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* re-install the signal handler (some systems need this) */
Packit Service fb6fa5
  signal(SIGCHLD, sigchld_handler);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* and unblock it */
Packit Service fb6fa5
  sigemptyset(&set);
Packit Service fb6fa5
  sigaddset(&set, SIGCHLD);
Packit Service fb6fa5
  sigprocmask(SIG_UNBLOCK, &set, &oldset);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gint delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return(FALSE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void destroy(GtkWidget *widget, gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_main_quit();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void fork_me(GtkWidget *widget, gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  pid_t pid;
Packit Service fb6fa5
Packit Service fb6fa5
  pid = fork();
Packit Service fb6fa5
Packit Service fb6fa5
  if(pid == -1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* ouch, fork() failed */
Packit Service fb6fa5
      perror("fork");
Packit Service fb6fa5
      exit(-1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if(pid == 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* child */
Packit Service fb6fa5
      fprintf(stderr, "Child: pid = %d\n", (int)getpid());
Packit Service fb6fa5
Packit Service fb6fa5
      execlp("ls", "ls", "-CF", "/", NULL);
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* if exec() returns, there is something wrong */
Packit Service fb6fa5
      perror("execlp");
Packit Service fb6fa5
Packit Service fb6fa5
      /* exit child. note the use of _exit() instead of exit() */
Packit Service fb6fa5
      _exit(-1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* parent */
Packit Service fb6fa5
      fprintf(stderr, "Parent: forked a child with pid = %d\n", (int)pid);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
int main(int argc, char *argv[])
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkWidget *window;
Packit Service fb6fa5
  GtkWidget *button;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_init(&argc, &argv);
Packit Service fb6fa5
Packit Service fb6fa5
  /* the basic stuff: make a window and set callbacks for destroy and
Packit Service fb6fa5
   * delete events 
Packit Service fb6fa5
   */
Packit Service fb6fa5
  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_connect(G_OBJECT (window), "delete_event",
Packit Service fb6fa5
		     G_CALLBACK(delete_event), NULL);
Packit Service fb6fa5
          
Packit Service fb6fa5
  g_signal_connect(G_OBJECT (window), "destroy",
Packit Service fb6fa5
		     G_CALLBACK(destroy), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
#if (GTK_MAJOR_VERSION == 1) && (GTK_MINOR_VERSION == 0)
Packit Service fb6fa5
  gtk_container_border_width(GTK_CONTAINER (window), 10);
Packit Service fb6fa5
#else  
Packit Service fb6fa5
  gtk_container_set_border_width(GTK_CONTAINER (window), 10);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
  /* add a button to do something useful */
Packit Service fb6fa5
  button = gtk_button_new_with_label("Fork me!");
Packit Service fb6fa5
          
Packit Service fb6fa5
  g_signal_connect(G_OBJECT (button), "clicked",
Packit Service fb6fa5
		     G_CALLBACK(fork_me), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_container_add(GTK_CONTAINER(window), button);
Packit Service fb6fa5
          
Packit Service fb6fa5
  /* show everything */
Packit Service fb6fa5
  gtk_widget_show (button);
Packit Service fb6fa5
  gtk_widget_show (window);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  /* install a signal handler for SIGCHLD signals */
Packit Service fb6fa5
  signal(SIGCHLD, sigchld_handler);
Packit Service fb6fa5
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* main loop */
Packit Service fb6fa5
  gtk_main ();
Packit Service fb6fa5
Packit Service fb6fa5
  exit(0);         
Packit Service fb6fa5
}
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
CLASS="NAVFOOTER"
Packit Service fb6fa5
>
Packit Service fb6fa5
ALIGN="LEFT"
Packit Service fb6fa5
WIDTH="100%">
Packit Service fb6fa5
SUMMARY="Footer navigation table"
Packit Service fb6fa5
WIDTH="100%"
Packit Service fb6fa5
BORDER="0"
Packit Service fb6fa5
CELLPADDING="0"
Packit Service fb6fa5
CELLSPACING="0"
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="left"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x490.html"
Packit Service fb6fa5
ACCESSKEY="P"
Packit Service fb6fa5
><<< Previous
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="34%"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="book1.html"
Packit Service fb6fa5
ACCESSKEY="H"
Packit Service fb6fa5
>Home
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="right"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="x509.html"
Packit Service fb6fa5
ACCESSKEY="N"
Packit Service fb6fa5
>Next >>>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="left"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>What's an easy way to run a function in the thread with
Packit Service fb6fa5
the main loop? 
Packit Service fb6fa5
CLASS="EMPHASIS"
Packit Service fb6fa5
>[GTK 2.x]
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="34%"
Packit Service fb6fa5
ALIGN="center"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>
Packit Service fb6fa5
HREF="c466.html"
Packit Service fb6fa5
ACCESSKEY="U"
Packit Service fb6fa5
>Up
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
WIDTH="33%"
Packit Service fb6fa5
ALIGN="right"
Packit Service fb6fa5
VALIGN="top"
Packit Service fb6fa5
>Why don't the contents of a button move when the button
Packit Service fb6fa5
is pressed? Here's a patch to make it work that way... 
Packit Service fb6fa5
CLASS="EMPHASIS"
Packit Service fb6fa5
>[GTK 2.x]
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>
Packit Service fb6fa5
>