Hi,

If you are trying this on NLD(novel linux desktop), I suspect this may be
the solution.

Before the point at which you are creating the file_chooser_dialog, insert
the following statement:
sighandler_t oldhandler = signal(SIGCHLD, SIG_DFL)

and the point after which you destroy the dialog, insert the following
statement:
(void) signal(SIGCHLD, oldhandler);

This happens because SIGCHLD handler in file_chooser_dialog on NLD (Novel
linux desktop) has a crash.

Hope this helps!!
Yash




On 12/14/05, Ahmad Mouri Sardarabadi <[EMAIL PROTECTED]> wrote:
>
> hello every1,
>
> i'm trying to capture stdout.stderr of a child prosses while using gtk.
> i'v
> found the following codes and i changed it a little and it works perfect:
>
> void run_program( char *cmd)
> {
>
>    gint    stdin_pipe[2];
>    gint    stdout_pipe[2];
>    gint    stderr_pipe[2];
>
>    /*  Define buffs to copy your reads from the pipes to */
>    gchar buffer[BUFSIZ+1];
>    gchar buffer_err[BUFSIZ+1];
>
>    /* Def some vars to hold your results */
>    gint fork_result;
>    gint data_processed;
>    gint data_processed_err;
>    gint nchars;
>    nchars=0;
>
>    /* Clear Your Buffers */
>    memset(buffer, '\0', sizeof(buffer));
>    memset(buffer_err, '\0', sizeof(buffer_err));
>
>    /* Do the fork and pipe - watch closely here */
>
>    /* Create pipes to read from and write too */
>    if( (pipe(stdin_pipe) == 0)
>        && (pipe(stdout_pipe) == 0)
>        && (pipe(stderr_pipe) == 0)
>      )
>    {
>        /* Perform the fork */
>        fork_result = fork();
>
>        /* fork attempt was not successful */
>        if(fork_result == -1)
>        {
>            fprintf(stderr, "Fork Failure\n");
>            exit(EXIT_FAILURE);
>        }
>
>        /*  We're in the child process! */
>        else if(fork_result == 0)
>        {
>            /* Close the Child process' STDIN */
>            close(0);
>
>            /* Duplicate the Child's STDIN to the stdin_pipe file
> descriptor
> */
>            dup(stdin_pipe[0]);
>
>            /* Close the read and write to for the pipe for the child.  The
>
> child will now only be able to read from it's STDIN (which is our pipe).
> */
>            close(stdin_pipe[0]);
>            close(stdin_pipe[1]);
>
>            /* Close the Child process' STDOUT */
>            close(1);
>            dup(stdout_pipe[1]);
>            close(stdout_pipe[0]);
>            close(stdout_pipe[1]);
>
>            /* Close the Child process' STDERR */
>            close(2);
>            dup(stderr_pipe[1]);
>            close(stderr_pipe[0]);
>            close(stderr_pipe[1]);
>
>            /*  Make the system call to run the program. */
>            system(cmd);
>
>            /*  If javac didn't take over the exec call failed. */
>            exit(EXIT_FAILURE);
>        }
>
>        /* We're in the parent process. */
>        else
>        {
>            /* Close STDIN for read & write and close STDERR for write */
>            close(stdin_pipe[0]);
>            close(stdin_pipe[1]);
>            close(stderr_pipe[1]);
>
>            while(1)
>            {
>                data_processed_err=read(stderr_pipe[0],buffer_err,BUFSIZ);
>                if(data_processed_err == 0) break;
>                //addMsgInfo( buffer_err );
>                Msg_dialog("Error",buffer_err);
>            }
>            /* Close the read end of STDERR */
>
>            close(stderr_pipe[0]);
>            /* Close the write end of STDOUT */
>            close(stdout_pipe[1]);
>
>            while(1)
>            {
>                /* Read BUFSIZ of STDOUT data */
>                data_processed=read(stdout_pipe[0],buffer,BUFSIZ);
>
>                /* Break this loop when we're read all of the STDOUT data
> */
>                if(data_processed == 0) break;
>
>                /* Insert it into our gtktextbox */
>                addMsgInfo( buffer );
>            }
>
>            /* Close STDOUT for reading */
>            close(stdout_pipe[0]);
>        }
>    }
> }
>
>
> but if i call the following function (clicking that button):
>
> void on_button1_clicked(GtkButton *button, gpointer user_data){
>
> GtkWidget *dialog;
> GtkFileFilter *filter = gtk_file_filter_new ();
> GtkFileFilter *filter2 = gtk_file_filter_new ();
> GtkWidget *parent = lookup_widget(GTK_WIDGET(button), "win");
> GtkWidget *entry  = lookup_widget(GTK_WIDGET(button), "entry1");
> dialog = gtk_file_chooser_dialog_new ("Open Image File",
>                      parent,
>                      GTK_FILE_CHOOSER_ACTION_OPEN,
>                      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
>                      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
>                      NULL);
> gtk_file_filter_set_name        (filter,"Iso Files");
> gtk_file_filter_set_name        (filter2,"All Files");
> gtk_file_filter_add_pattern (filter, "*.iso");
> gtk_file_filter_add_pattern (filter2, "*.*");
> gtk_file_chooser_add_filter  (GTK_FILE_CHOOSER (dialog), filter);
> gtk_file_chooser_add_filter  (GTK_FILE_CHOOSER (dialog), filter2);
>
> if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
> {
>    char *filename;
>
>    filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER (dialog));
>    gtk_entry_set_text(GTK_ENTRY(entry),filename);
>    g_free (filename);
> }
>
> gtk_widget_destroy (dialog);
>
> }
>
>
> befor using the first one my program chrashes. has anyone any idea? i
> can't
> actually find any relationship bitween these two functions. but with a
> little experiment i realized it crashesh if i make any dialog (filechooser
> or not) in my programm.
>
> thankx
>
> Ammsa
>
>
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
  • GTK pipe Ahmad Mouri Sardarabadi
    • Re: GTK pipe Yash Kumar Gupta

Reply via email to