Web lists-archives.com

Re: Can't read stdout of bash with GSubprocess on MSYS2




Hi Fan,

Thanks! Your code works. A further question: How can I hide this console window?

Actually these days I can spawn bash and read stdout by using CreateProcess() and pipes, and I can hide the console window of bash by setting a flag in an argument to CreateProcess().

Thanks
Gang

2015-09-29 13:43 GMT+08:00 Fan, Chun-wei (范君維) <fanc999@xxxxxxxxxxxx>:
Hi Gang,

You can take a look at https://support.microsoft.com/en-US/kb/105305.  Basically, you need to have a console attached to the GUI app for your case to work.

By running your code, and by adding AllocConsole() just before you spawn the subprocess, I was able to get the output.

Hope this helps.  With blessings.



Gang Chen 於 2015/9/28 上午 10:01 寫道:

Hi,
I'm writing a GTK+ application with MINGW-W64, which spawns a subprocess running bash to execute some commands with GSubprocess and reads stdout of bash (installed from MSYS2). I found that if compiled without "-mwindows" compilation option the main process can read the stdout, while with "-mwindows", the read function always returns 0 bytes read. If the main process runs a normal console program, or like "mingw32/bin/gcc.exe", then it can read stdout even if compiled with "-mwindows".
The code:

#include  <glib.h>
#include  <gio/gio.h>
#include  <gtk/gtk.h>
#include  <stdio.h>

char  buffer[100];
GtkTextView *text;

void  ondataread(GObject *s, GAsyncResult *r, gpointer p)
{
     GError *error =NULL;
     int  l =g_input_stream_read_finish(G_INPUT_STREAM(s), r, &error);
     if  (error)
         printf("read error: %s\n", error->message);
     else  if  (l >0)
     {
         gtk_text_buffer_insert_at_cursor(gtk_text_view_get_buffer(text), buffer, l);
         g_input_stream_read_async(G_INPUT_STREAM(s), buffer,100, G_PRIORITY_DEFAULT,NULL, ondataread,NULL);
     }
}

int  main(int  argc,char  **argv)
{
     char  *subpargv[8] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL  };
subpargv[0] = "D:\\msys64\\usr\\bin\\bash.exe";
subpargv[1] = "-c";
subpargv[2] = "echo good; sleep 10; pwd";
// subpargv[0] = "C:\\Windows\\system32\\cmd.exe";
// subpargv[1] = "/c";
// subpargv[2] = "echo good";
// subpargv[0] = "D:\\msys64\\mingw32\\bin\\gcc.exe";
// subpargv[1] = "notfile";
     GSubprocessLauncher *l =g_subprocess_launcher_new(G_SUBPROCESS_FLAGS_STDOUT_PIPE | G_SUBPROCESS_FLAGS_STDERR_PIPE);
     GError *error =NULL;
     GSubprocess *p =g_subprocess_launcher_spawnv(l, subpargv, &error);
     if  (!p)
     {
         printf("spawn error: %s\n", error->message);
         return  -1;
     }
     g_object_unref(l);
     g_input_stream_read_async(g_subprocess_get_stdout_pipe(p), buffer,100, G_PRIORITY_DEFAULT,NULL, ondataread,NULL);
     g_input_stream_read_async(g_subprocess_get_stderr_pipe(p), buffer,100, G_PRIORITY_DEFAULT,NULL, ondataread,NULL);
     gtk_init(&argc, &argv);
     GtkWidget *win =gtk_window_new(GTK_WINDOW_TOPLEVEL);
     GtkWidget *t =gtk_text_view_new();
     gtk_container_add(GTK_CONTAINER(win), t);
     text =GTK_TEXT_VIEW(t);
     gtk_widget_show_all(win);
     gtk_main();
     return  0;
}

How to read stdout correctly?
Thanks,
Gang



_______________________________________________
gtk-list mailing list
gtk-list@xxxxxxxxx
https://mail.gnome.org/mailman/listinfo/gtk-list


_______________________________________________
gtk-list mailing list
gtk-list@xxxxxxxxx
https://mail.gnome.org/mailman/listinfo/gtk-list