Re: GTK pipe



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 <wildworld_ammsa hotmail com> 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




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]