Coding a console program frontend
- From: Pedro Saraiva <pedro a34195 gmail com>
- To: gtk-app-devel-list gnome org
- Subject: Coding a console program frontend
- Date: Mon, 12 Oct 2009 11:07:18 +0100
Hello,
I'm new to GTK+ programming.
I've a console program in C, and I need to create a simple frontent to it.
The frontend will show the progress and information about the state of the
console program.
I realise that I can pass the data using pipes, but is there a better
alternative?
Now, for testing the data transfer using a pipe, I've been hacking on a
simple example:
#include <gtk/gtk.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <glib.h>
static void createGUI( gint *parentToChild );
static gboolean readMessage( GIOChannel *channel, GIOCondition condition,
GtkLabel *label );
static void consoleProgram( gint *parentToChild );
static void createGUI( gint *parentToChild )
{
GtkWidget *window, *label;
GIOChannel *in;
window = gtk_window_new( GTK_WINDOW_TOPLEVEL );
label = gtk_label_new( NULL );
gtk_container_add( GTK_CONTAINER( window ), label );
gtk_container_set_border_width( GTK_CONTAINER( window ), 5 );
gtk_widget_set_size_request( window, 200, 100 );
gtk_widget_show_all( window );
/* Close the unnecessary pipe */
close( parentToChild[1] );
/* Create a read channels */
if ( ( in = g_io_channel_unix_new( parentToChild[0] ) ) == NULL )
g_error( "error: the channel could not be created.\n" );
/* Watch the read channel for changes */
if ( !g_io_add_watch( in, G_IO_IN | G_IO_HUP,
( GIOFunc ) readMessage, ( gpointer ) label ) )
g_error( "error: Read watch could not be added.\n" );
gtk_window_set_title( GTK_WINDOW( window ), "Counter GUI" );
}
static gboolean readMessage( GIOChannel *channel, GIOCondition condition,
GtkLabel *label )
{
gchar *message;
gsize length;
/* The pipe has died */
if ( condition & G_IO_HUP )
g_error( "error: The pipe has died.\n" );
printf( "BEFORE READ LINE\n" );
/* Read the data from pipe. */
if ( g_io_channel_read_line( channel, &message, &length, NULL, NULL )
== G_IO_STATUS_ERROR )
g_error ( "error: The message could not be read.\n" );
printf( "AFTER READ LINE\n" );
message[ length - 1 ] = 0;
gtk_label_set_text( label, message );
return TRUE;
}
static void consoleProgram( gint *parentToChild )
{
close( parentToChild[0] );
GIOChannel *out = g_io_channel_unix_new( parentToChild[1] );
if ( out == NULL )
g_error( "error: output channel could not be created.\n" );
int count;
gchar *msg[5] = { "message1", "message2", "message3", "message4",
"message5"
};
for ( count = 0; count < 5; ++count )
{
fprintf( stderr, "%s\n", msg[count] );
fflush( stderr );
gsize length = 0;
/* Send message to child. */
if ( g_io_channel_write_chars( out, msg[count], -1, &length, NULL )
== G_IO_STATUS_ERROR )
g_error( "error: The changes could not be written to the
pipe!\n" );
fprintf( stderr, "Bytes writted = %d\n", length );
g_io_channel_flush( out, NULL );
sleep( 5 );
}
}
int main( int argc, char **argv )
{
gint parentToChild[2], pid;
if ( pipe( parentToChild ) < 0 )
{
fprintf( stderr, "error: %s\n", g_strerror( errno ) );
exit( 1 );
}
pid = fork();
switch ( pid )
{
case -1:
g_error( "error: %s\n", g_strerror( errno ) );
exit( 1 );
case 0: // GUI
gtk_init( &argc, &argv );
createGUI( parentToChild );
gtk_main();
break;
default: // Console
consoleProgram( parentToChild );
}
return 0;
}
However the child proccess (the GUI) when tries to read data from the pipe
it hangs. If you run this program you can see that the printf( "BEFORE READ
LINE\n" ) is printed but the printf( "AFTER READ LINE\n" ) is not..
What I'm doing wrong?
Thanks,
Pedro Saraiva
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]