Home
  Software
    HowTo
      GTK+
        IOChannel

Idioma:
  English

En esta página
  GUI
  Código cliente
  Código servidor
  Gracias

Temas
  GIOChannel
  Gio.IOChannel
  FIFO chat
  Socket chat

GTK+ - GIOChannel

Basado en el manual GIOChannel

El canal GIOChannel intenta de brindar un método portatil para el de diferentes medios de comunicación: pipes, descriptores de archivos, y zócalos. Además intenta de integrar su uso en el lazo principal del programa. Actualmente, sólo en Linux el soporte es completo, en Windows todavía quedan algunos problemas.

Para crear un nuevo GIOChannel, se utiliza la función g_io_channel_unix_new() para conectar un canal con un archivo abierto. Esto funciona para los tres tipos de archivos. Alternativamente, se puede crear un archivo nuevo, en forma independiente del sistema, utilizando g_io_channel_new_file(). En el ejemplo, se abre un puerto serial, luego el canal.
GIOChannel *ioch;

fd = open(port, O_RDWR | O_NONBLOCK | O_NOCTTY);
if (fd == -1)
  <mensaje de error y salida>
  ...
ioch = g_io_channel_unix_new(fd);
Una vez creado el archivo, se puede leer ( g_io_channel_read_chars()), escribir ( g_io_channel_write_chars()), cambiar de posición ( g_io_channel_seek_position()), y cerrar el canal ( g_io_channel_close()).
g_io_channel_write_chars(ioch, &cmd, 1, &written, &error);
g_io_channel_flush(ioch, NULL);
    
Para evitar la necesidad de controlar el canal continuamente, se pueden declarar funciones que serán llamados al producirse el evento correspondientes con g_io_add_watch() o g_io_add_watch_full().
int     iowatch = -1;

iowatch = g_io_add_watch(ioch, G_IO_IN, io_callback, NULL);
    
En este caso es necesario de definir una función que será llamada cuando se produce el evento (en este caso, io_callback será llamada cuando se produce el evento 'G_IO_IN', i.e. cuando entran caracteres por el canal.
gboolean
io_callback(GIOChannel *ioch, GIOCondition cond, gpointer data)
{
  int bytes_read;
  unsigned char chr;

  do {
    g_io_channel_read_chars(ioch, &chr, 1, &bytes_read, NULL);
    if (bytes_read) {
      process_char(chr);
      if (pref.diag_comm) printf("%02x\n", chr);
    }
  } while (bytes_read);
  return TRUE;
}

Código ejemplo

El código completo para este ejemplo está aquí. Por favor tome nota que no se trata de un programa completo! Todavía tendrá que agregar un programa principal y codigo que utiliza los datos de alguna forma. Esto no es un curso de C!

9908
(c) John Coppens ON6JC/LW3HAZ correo