Hi,

Some days ago I posted this problem, no reaction yet.
Can anybody comment on it? Is the problem clear?

A small refrase:

g_spawn_async_with_pipes starts an external program.
This program generates data on stdout.
The function attached to g_child_watch_add does do the postprocessing.

The problem is that due to pipe-filling the program halts, so postprocessor 
isn't started, as a result a lockup.


The relevant code:

Main:
(with argv[0]=program, argv[1]... its arguments) 
g_spawn_async_with_pipes(NULL,argv,NULL,
                         G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_SEARCH_PATH,
                         NULL,NULL,&pid,NULL,
                         &fd,NULL,NULL);
g_child_watch_add(pid,(GChildWatchFunc)post_process,(gpointer)fd);


The postprocessing:

static void post_process(GPid pid,int status,gpointer data)
{
  int fd=(int)data;

  if (fd)
  {
    while ((read(fd,&b,1)))
    {
...
    }
    close(fd);
  }
}

This locks up if the amount of data exceeds a certain limit.


Alternative: Redirect output to a file, do postprocessing on that.

Relevant code:

(with argv[..]=program > output_file)   
g_spawn_async(NULL,argv,NULL,G_SPAWN_DO_NOT_REAP_CHILD|G_SPAWN_SEARCH_PATH,NULL,NULL,&pid,NULL);
g_child_watch_add(pid,(GChildWatchFunc)post_process,data);



This doesn't seem to work: a program redirecting to a file used with
g_spawn_async.

Any idea to solve this problem, either with or without piping?

Regards,
Rob A.



Rob Alblas wrote:
> Hi,
> I want to execute an external program using g_spawn_async_with_pipes.
> This program outputs ASCII to stdout, which I want to catch using
> g_child_watch_add.
> This works fine, but if the data exceeds a certain amount of data
> apparently the pipe gets 'full', causing the ext. program to wait with
> outputting.
> As a result the g_child_watch_add will not start reading the pipe.
>
> So g_child_watch_add waits until the ext. program is finished and the
> ext. program waits until g_child_watch_add starts with reading from the
> pipe.
>
> How to deal with this?
>
> I tried to redirect the output to a file, and use g_spawn_async instead
> of g_spawn_async_with_pipes, but redirecting seems not to be accepted by
> g_spawn_async.
>
> (For this second method I tried flags G_SPAWN_FILE_AND_ARGV_ZERO and
> |G_SPAWN_STDOUT_TO_DEV_NULL, without success.)
> |
>
> Rob A.
>
>
>
>   

-- 
This message has been scanned for viruses and is believed to be clean

_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to