Re: GTK pipe
- From: Yash Kumar Gupta <ygupta gmail com>
- To: Ahmad Mouri Sardarabadi <wildworld_ammsa hotmail com>
- Cc: gtk-app-devel-list gnome org
- Subject: Re: GTK pipe
- Date: Wed, 14 Dec 2005 15:57:03 +0530
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]