[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
Re: g_spawn_async lockup
- From: Rob Alblas <ralblas aimcom nl>
- To: gtk-app-devel-list gnome org
- Subject: Re: g_spawn_async lockup
- Date: Fri, 11 Jul 2008 18:15:02 +0200
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
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]