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]